📄 attribute.java
字号:
/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* * Attribute.java * Copyright (C) 1999 Eibe Frank * */package weka.core;import java.io.*;import java.util.*;/** * Class for handling an attribute. Once an attribute has been created, * it can't be changed. <p> * * Three attribute types are supported: * <ul> * <li> numeric: <ul> * This type of attribute represents a floating-point number. * </ul> * <li> nominal: <ul> * This type of attribute represents a fixed set of nominal values. * </ul> * <li> string: <ul> * This type of attribute represents a dynamically expanding set of * nominal values. String attributes are not used by the learning * schemes in Weka. They can be used, for example, to store an * identifier with each instance in a dataset. * </ul> * </ul> * Typical usage (code from the main() method of this class): <p> * * <code> * ... <br> * * // Create numeric attributes "length" and "weight" <br> * Attribute length = new Attribute("length"); <br> * Attribute weight = new Attribute("weight"); <br><br> * * // Create vector to hold nominal values "first", "second", "third" <br> * FastVector my_nominal_values = new FastVector(3); <br> * my_nominal_values.addElement("first"); <br> * my_nominal_values.addElement("second"); <br> * my_nominal_values.addElement("third"); <br><br> * * // Create nominal attribute "position" <br> * Attribute position = new Attribute("position", my_nominal_values);<br> * * ... <br> * </code><p> * * @author Eibe Frank (eibe@cs.waikato.ac.nz) * @version $Revision: 1.19.2.3 $ */public class Attribute implements Copyable, Serializable { /** Constant set for numeric attributes. */ public final static int NUMERIC = 0; /** Constant set for nominal attributes. */ public final static int NOMINAL = 1; /** Constant set for attributes with string values. */ public final static int STRING = 2; /** Strings longer than this will be stored compressed. */ private final static int STRING_COMPRESS_THRESHOLD = 200; /** The attribute's name. */ private String m_Name; /** The attribute's type. */ private int m_Type; /** The attribute's values (if nominal or string). */ private FastVector m_Values; /** Mapping of values to indices (if nominal or string). */ private Hashtable m_Hashtable; /** The attribute's index. */ private int m_Index; /** * Constructor for a numeric attribute. * * @param attributeName the name for the attribute */ public Attribute(String attributeName) { m_Name = attributeName; m_Index = -1; m_Values = null; m_Hashtable = null; m_Type = NUMERIC; } /** * Constructor for nominal attributes and string attributes. * 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. */ public Attribute(String attributeName, FastVector attributeValues) { m_Name = attributeName; m_Index = -1; if (attributeValues == null) { m_Values = new FastVector(); m_Hashtable = new Hashtable(); m_Type = STRING; } else { m_Values = new FastVector(attributeValues.size()); m_Hashtable = new Hashtable(attributeValues.size()); for (int i = 0; i < attributeValues.size(); i++) { Object store = attributeValues.elementAt(i); if (((String)store).length() > STRING_COMPRESS_THRESHOLD) { try { store = new SerializedObject(attributeValues.elementAt(i), true); } catch (Exception ex) { System.err.println("Couldn't compress nominal attribute value -" + " storing uncompressed."); } } m_Values.addElement(store); m_Hashtable.put(store, new Integer(i)); } m_Type = NOMINAL; } } /** * Produces a shallow copy of this attribute. * * @return a copy of this attribute with the same index */ public Object copy() { Attribute copy = new Attribute(m_Name); copy.m_Index = m_Index; if (!isNominal() && !isString()) return copy; copy.m_Type = m_Type; copy.m_Values = m_Values; copy.m_Hashtable = m_Hashtable; return copy; } /** * Returns an enumeration of all the attribute's values if * the attribute is nominal or a string, null otherwise. * * @return enumeration of all the attribute's values */ public final Enumeration enumerateValues() { if (isNominal() || isString()) { final Enumeration ee = m_Values.elements(); return new Enumeration () { public boolean hasMoreElements() { return ee.hasMoreElements(); } public Object nextElement() { Object oo = ee.nextElement(); if (oo instanceof SerializedObject) { return ((SerializedObject)oo).getObject(); } else { return oo; } } }; } return null; } /** * Tests if given attribute is equal to this attribute. * * @param other the Object to be compared to this attribute * @return true if the given attribute is equal to this attribute */ public final boolean equals(Object other) { if ((other == null) || !(other.getClass().equals(this.getClass()))) { return false; } Attribute att = (Attribute) other; if (!m_Name.equals(att.m_Name)) { return false; } if (isNumeric() && att.isNumeric()) { return true; } if (isNumeric() || att.isNumeric()) { return false; } if (m_Values.size() != att.m_Values.size()) { return false; } for (int i = 0; i < m_Values.size(); i++) { if (!m_Values.elementAt(i).equals(att.m_Values.elementAt(i))) { return false; } } return true; } /** * Returns the index of this attribute. * * @return the index of this attribute */ public final int index() { return m_Index; } /** * Returns the index of a given attribute value. (The index of * the first occurence of this value.) * * @param value the value for which the index is to be returned * @return the index of the given attribute value if attribute * is nominal or a string, -1 if it is numeric or the value * can't be found */ public final int indexOfValue(String value) { if (!isNominal() && !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 -" + " searching uncompressed."); } } Integer val = (Integer)m_Hashtable.get(store); if (val == null) return -1; else return val.intValue(); } /** * Test if the attribute is nominal. * * @return true if the attribute is nominal */ public final boolean isNominal() { 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); } /** * Tests if the attribute is a string. * * @return true if the attribute is a string */ public final boolean isString() { return (m_Type == STRING); } /** * 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("@attribute " + Utils.quote(m_Name) + " "); if (isNominal()) { text.append('{'); Enumeration enum = enumerateValues(); while (enum.hasMoreElements()) { text.append(Utils.quote((String) enum.nextElement())); if (enum.hasMoreElements()) text.append(','); } text.append('}'); } else { if (isNumeric()) { text.append("numeric");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -