📄 attribute.java
字号:
return (m_Type == NOMINAL);
}
/**
* Tests if the attribute is numeric.
*
* @return true if the attribute is numeric
*/
public final boolean isNumeric() {
return ((m_Type == NUMERIC) || (m_Type == DATE));
}
/**
* Tests if the attribute is a string.
*
* @return true if the attribute is a string
*/
public final boolean isString() {
return (m_Type == STRING);
}
/**
* Tests if the attribute is a date type.
*
* @return true if the attribute is a date type
*/
public final boolean isDate() {
return (m_Type == DATE);
}
/**
* Returns the attribute's name.
*
* @return the attribute's name as a string
*/
public final String name() {
return m_Name;
}
/**
* Returns the number of attribute values. Returns 0 for numeric attributes.
*
* @return the number of attribute values
*/
public final int numValues() {
if (!isNominal() && !isString()) {
return 0;
} else {
return m_Values.size();
}
}
/**
* Returns a description of this attribute in ARFF format. Quotes
* strings if they contain whitespace characters, or if they
* are a question mark.
*
* @return a description of this attribute as a string
*/
public final String toString() {
StringBuffer text = new StringBuffer();
text.append(ARFF_ATTRIBUTE).append(" ").append(Utils.quote(m_Name)).append(" ");
switch (m_Type) {
case NOMINAL:
text.append('{');
Enumeration em = emerateValues();
while (em.hasMoreElements()) {
text.append(Utils.quote((String) em.nextElement()));
if (em.hasMoreElements())
text.append(',');
}
text.append('}');
break;
case NUMERIC:
text.append(ARFF_ATTRIBUTE_NUMERIC);
break;
case STRING:
text.append(ARFF_ATTRIBUTE_STRING);
break;
case DATE:
text.append(ARFF_ATTRIBUTE_DATE).append(" ").append(Utils.quote(m_DateFormat.toPattern()));
break;
default:
text.append("UNKNOWN");
break;
}
return text.toString();
}
/**
* Returns the attribute's type as an integer.
*
* @return the attribute's type.
*/
public final int type() {
return m_Type;
}
/**
* Returns a value of a nominal or string attribute.
* Returns an empty string if the attribute is neither
* nominal nor a string attribute.
*
* @param valIndex the value's index
* @return the attribute's value as a string
*/
public final String value(int valIndex) {
if (!isNominal() && !isString()) {
return "";
} else {
Object val = m_Values.elementAt(valIndex);
// If we're storing strings compressed, uncompress it.
if (val instanceof SerializedObject) {
val = ((SerializedObject)val).getObject();
}
return (String) val;
}
}
/**
* Constructor for a numeric attribute with a particular index.
*
* @param attributeName the name for the attribute
* @param index the attribute's index
*/
Attribute(String attributeName, int index) {
this(attributeName);
m_Index = index;
}
/**
* Constructor for date attributes with a particular index.
*
* @param attributeName the name for the attribute
* @param dateFormat a string suitable for use with
* SimpleDateFormatter for parsing dates. Null for a default format
* string.
* @param index the attribute's index
*/
Attribute(String attributeName, String dateFormat,
int index) {
this(attributeName, dateFormat);
m_Index = index;
}
/**
* Constructor for nominal attributes and string attributes with
* a particular index.
* If a null vector of attribute values is passed to the method,
* the attribute is assumed to be a string.
*
* @param attributeName the name for the attribute
* @param attributeValues a vector of strings denoting the attribute values.
* Null if the attribute is a string attribute.
* @param index the attribute's index
*/
Attribute(String attributeName, FastVector attributeValues,
int index) {
this(attributeName, attributeValues);
m_Index = index;
}
/**
* Adds a string value to the list of valid strings for attributes
* of type STRING and returns the index of the string.
*
* @param value The string value to add
* @return the index assigned to the string, or -1 if the attribute is not
* of type Attribute.STRING
*/
public int addStringValue(String value) {
if (!isString()) {
return -1;
}
Object store = value;
if (value.length() > STRING_COMPRESS_THRESHOLD) {
try {
store = new SerializedObject(value, true);
} catch (Exception ex) {
System.err.println("Couldn't compress string attribute value -"
+ " storing uncompressed.");
}
}
Integer index = (Integer)m_Hashtable.get(store);
if (index != null) {
return index.intValue();
} else {
int intIndex = m_Values.size();
m_Values.addElement(store);
m_Hashtable.put(store, new Integer(intIndex));
return intIndex;
}
}
/**
* Adds a string value to the list of valid strings for attributes
* of type STRING and returns the index of the string. This method is
* more efficient than addStringValue(String) for long strings.
*
* @param src The Attribute containing the string value to add.
* @param int index the index of the string value in the source attribute.
* @return the index assigned to the string, or -1 if the attribute is not
* of type Attribute.STRING
*/
public int addStringValue(Attribute src, int index) {
if (!isString()) {
return -1;
}
Object store = src.m_Values.elementAt(index);
Integer oldIndex = (Integer)m_Hashtable.get(store);
if (oldIndex != null) {
return oldIndex.intValue();
} else {
int intIndex = m_Values.size();
m_Values.addElement(store);
m_Hashtable.put(store, new Integer(intIndex));
return intIndex;
}
}
/**
* Adds an attribute value. Creates a fresh list of attribute
* values before adding it.
*
* @param value the attribute value
*/
final void addValue(String value) {
m_Values = (FastVector)m_Values.copy();
m_Hashtable = (Hashtable)m_Hashtable.clone();
forceAddValue(value);
}
/**
* Produces a shallow copy of this attribute with a new name.
*
* @param newName the name of the new attribute
* @return a copy of this attribute with the same index
*/
final Attribute copy(String newName) {
Attribute copy = new Attribute(newName);
copy.m_Index = m_Index;
copy.m_DateFormat = m_DateFormat;
copy.m_Type = m_Type;
copy.m_Values = m_Values;
copy.m_Hashtable = m_Hashtable;
copy.setMetadata(m_Metadata);
return copy;
}
/**
* Removes a value of a nominal or string attribute. Creates a
* fresh list of attribute values before removing it.
*
* @param index the value's index
* @exception IllegalArgumentException if the attribute is not nominal
*/
final void delete(int index) {
if (!isNominal() && !isString())
throw new IllegalArgumentException("Can only remove value of" +
"nominal or string attribute!");
else {
m_Values = (FastVector)m_Values.copy();
m_Values.removeElementAt(index);
Hashtable hash = new Hashtable(m_Hashtable.size());
Enumeration em = m_Hashtable.keys();
while (em.hasMoreElements()) {
Object string = em.nextElement();
Integer valIndexObject = (Integer)m_Hashtable.get(string);
int valIndex = valIndexObject.intValue();
if (valIndex > index) {
hash.put(string, new Integer(valIndex - 1));
} else if (valIndex < index) {
hash.put(string, valIndexObject);
}
}
m_Hashtable = hash;
}
}
/**
* Adds an attribute value.
*
* @param value the attribute value
*/
final void forceAddValue(String value) {
Object store = value;
if (value.length() > STRING_COMPRESS_THRESHOLD) {
try {
store = new SerializedObject(value, true);
} catch (Exception ex) {
System.err.println("Couldn't compress string attribute value -"
+ " storing uncompressed.");
}
}
m_Values.addElement(store);
m_Hashtable.put(store, new Integer(m_Values.size() - 1));
}
/**
* Sets the index of this attribute.
*
* @param the index of this attribute
*/
final void setIndex(int index) {
m_Index = index;
}
/**
* Sets a value of a nominal attribute or string attribute.
* Creates a fresh list of attribute values before it is set.
*
* @param index the value's index
* @param string the value
* @exception IllegalArgumentException if the attribute is not nominal or
* string.
*/
final void setValue(int index, String string) {
switch (m_Type) {
case NOMINAL:
case STRING:
m_Values = (FastVector)m_Values.copy();
m_Hashtable = (Hashtable)m_Hashtable.clone();
Object store = string;
if (string.length() > STRING_COMPRESS_THRESHOLD) {
try {
store = new SerializedObject(string, true);
} catch (Exception ex) {
System.err.println("Couldn't compress string attribute value -"
+ " storing uncompressed.");
}
}
m_Hashtable.remove(m_Values.elementAt(index));
m_Values.setElementAt(store, index);
m_Hashtable.put(store, new Integer(index));
break;
default:
throw new IllegalArgumentException("Can only set values for nominal"
+ " or string attributes!");
}
}
public String formatDate(double date) {
switch (m_Type) {
case DATE:
return m_DateFormat.format(new Date((long)date));
default:
throw new IllegalArgumentException("Can only format date values for date"
+ " attributes!");
}
}
public double parseDate(String string) throws ParseException {
switch (m_Type) {
case DATE:
long time = m_DateFormat.parse(string).getTime();
// TODO put in a safety check here if we can't store the value in a double.
return (double)time;
default:
throw new IllegalArgumentException("Can only parse date values for date"
+ " attributes!");
}
}
/**
* Returns the properties supplied for this attribute.
*
* @return metadata for this attribute
*/
public final ProtectedProperties getMetadata() {
return m_Metadata;
}
/**
* Returns the ordering of the attribute. One of the following:
*
* ORDERING_SYMBOLIC - attribute values should be treated as symbols.
* ORDERING_ORDERED - attribute values have a global ordering.
* ORDERING_MODULO - attribute values have an ordering which wraps.
*
* @return the ordering type of the attribute
*/
public final int ordering() {
return m_Ordering;
}
/**
* Returns whether the attribute values are equally spaced.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -