⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 propertylist.java

📁 常用机器学习算法,java编写源代码,内含常用分类算法,包括说明文档
💻 JAVA
字号:
/* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept.   This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).   http://www.cs.umass.edu/~mccallum/mallet   This software is provided under the terms of the Common Public License,   version 1.0, as published by http://www.opensource.org.  For further   information, see the file `LICENSE' included with this distribution. *//**    @author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a> */package edu.umass.cs.mallet.base.util;import java.util.Iterator;import java.util.HashSet;import java.util.HashMap;import java.io.*;public class PropertyList implements Serializable{	protected PropertyList next;	protected String key;	public static PropertyList add (String key, Object value,																	PropertyList rest)	{		assert (key != null);		return new ObjectProperty (key, value, rest);	}	public static PropertyList add (String key, String value,																	PropertyList rest)	{		assert (key != null);		return new ObjectProperty (key, value, rest);	}		public static PropertyList add (String key, double value,																	PropertyList rest)	{		assert (key != null);		return new NumericProperty (key, value, rest);	}	public static PropertyList remove (String key, 																		 PropertyList rest)	{		assert (key != null);		return new ObjectProperty (key, null, rest);	}		public Object lookupObject (String key)	{		if (this.key.equals (key)) {			if (this instanceof ObjectProperty)				return ((ObjectProperty)this).value;			else if (this instanceof NumericProperty)				return new Double(((NumericProperty)this).value);			else				throw new IllegalStateException ("Unrecognitized PropertyList entry.");		} else if (this.next == null) {			return null;		} else {			return next.lookupObject (key);		}	}	public double lookupNumber (String key)	{		if (this.key.equals (key)) {			if (this instanceof NumericProperty)				return ((NumericProperty)this).value;			else if (this instanceof ObjectProperty) {				Object obj = ((ObjectProperty)this).value;				if (obj == null) return 0;				// xxx Remove these?  Use might ask for numericIterator expecting to get these (and not!)				if (obj instanceof Double) return ((Double)obj).doubleValue();				if (obj instanceof Integer) return ((Double)obj).intValue();				if (obj instanceof Float) return ((Double)obj).floatValue();				if (obj instanceof Short) return ((Double)obj).shortValue();				if (obj instanceof Long) return ((Double)obj).longValue();				// xxx? throw new IllegalStateException ("Property is not numeric.");				return 0;			} else				throw new IllegalStateException ("Unrecognitized PropertyList entry.");		} else if (this.next == null) {			return 0;		} else {			return next.lookupNumber (key);		}	}	public boolean hasProperty (String key)	{		if (this.key.equals (key)) {			if (this instanceof ObjectProperty && ((ObjectProperty)this).value == null)				return false;			else				return true;		} else if (this.next == null) {			return false;		} else {			return next.hasProperty (key);		}	}		public Iterator iterator ()	{		return new Iterator (this);	}	// culotta 2/02/04: to increment counts of properties values.	public static PropertyList sumDuplicateKeyValues (PropertyList pl) {		if (!(pl instanceof NumericProperty))			throw new IllegalArgumentException ("PropertyList must be Numeric to sum values");		HashMap key2value = new HashMap ();		Iterator iter = pl.numericIterator();		while (iter.hasNext()) {			iter.nextProperty ();			String key = iter.getKey();			double val = iter.getNumericValue();			Double storedValue = (Double)key2value.get (key);			if (storedValue == null)				key2value.put (key, new Double (val));			else // sum stored value with current value				key2value.put (key, new Double (storedValue.doubleValue() + val));		}		PropertyList ret = null;		java.util.Iterator hashIter = key2value.keySet().iterator();		while (hashIter.hasNext()) { // create new property list			String key = (String) hashIter.next();			double val = ((Double)key2value.get (key)).doubleValue();			ret = PropertyList.add (key, val, ret);		}		return ret;	}		public Iterator numericIterator ()	{		return new NumericIterator (this);	}	public Iterator objectIterator ()	{		return new ObjectIterator (this);	}		protected PropertyList ()	{		throw new IllegalArgumentException ("Zero args constructor not allowed.");	}		protected PropertyList (String key, PropertyList rest)	{		this.key = key;		this.next = rest;	}	public void print ()	{		if (this instanceof NumericProperty)			System.out.println (this.key.toString() + "=" + ((NumericProperty)this).value);		else if (this instanceof ObjectProperty)			System.out.println (this.key.toString() + "=" + ((ObjectProperty)this).value);		else			throw new IllegalArgumentException ("Unrecognized PropertyList type");		if (this.next != null)			this.next.print();	}	// Serialization 	// PropertyList		private static final long serialVersionUID = 1;	private static final int CURRENT_SERIAL_VERSION = 0;		private void writeObject (ObjectOutputStream out) throws IOException {		out.writeInt (CURRENT_SERIAL_VERSION);		out.writeObject(next);		out.writeObject(key);	}		private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {		int version = in.readInt ();		next = (PropertyList) in.readObject();		key = (String) in.readObject();	}		private static class NumericProperty extends PropertyList implements Serializable	{		protected double value;		public NumericProperty (String key, double value, PropertyList rest)		{			super (key, rest);			this.value = value;		}		// Serialization 		// NumericProperty		private static final long serialVersionUID = 1;		private static final int CURRENT_SERIAL_VERSION = 0;				private void writeObject (ObjectOutputStream out) throws IOException {			out.writeInt(CURRENT_SERIAL_VERSION);			out.writeDouble(value);		}				private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {			int version = in.readInt();			value = in.readDouble();		}	}	private static class ObjectProperty extends PropertyList	{		protected Object value;		public ObjectProperty (String key, Object value, PropertyList rest)		{			super (key, rest);			this.value = value;		}		// Serialization 		// ObjectProperty				private static final long serialVersionUID = 1;		private static final int CURRENT_SERIAL_VERSION = 0;		private void writeObject (ObjectOutputStream out) throws IOException {			out.writeInt(CURRENT_SERIAL_VERSION);			out.writeObject(value);		}				private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {		  int version = in.readInt();			value = (Object) in.readObject();		}	}	public class Iterator implements java.util.Iterator, Serializable	{		PropertyList property, nextProperty;		HashSet deletedKeys = null;		boolean nextCalled = false;		boolean returnNumeric = true;		boolean returnObject = true;		public Iterator (PropertyList pl)		{			property = findReturnablePropertyAtOrAfter (pl);			if (property == null)				nextProperty = null;			else				nextProperty = findReturnablePropertyAtOrAfter (property.next);		}		private PropertyList findReturnablePropertyAtOrAfter (PropertyList property)		{			while (property != null) {				if (property instanceof NumericProperty && returnNumeric) {					if (((NumericProperty)property).value == 0.0) {						if (deletedKeys == null) deletedKeys = new HashSet();						deletedKeys.add (property.key);						property = property.next;					} else						break;				} else if (property instanceof ObjectProperty && returnObject) {					if (((ObjectProperty)property).value == null) {						if (deletedKeys == null) deletedKeys = new HashSet();						deletedKeys.add (property.key);						property = property.next;					} else						break;				} else					throw new IllegalStateException ("Unrecognized property type "+property.getClass().getName());			}			return property;		}				public boolean hasNext ()		{			return ((nextCalled && nextProperty != null) || (!nextCalled && property != null));		}		public boolean isNumeric ()		{			return (property instanceof NumericProperty);		}		public double getNumericValue ()		{			return ((NumericProperty)property).value;		}		public Object getObjectValue ()		{			return ((ObjectProperty)property).value;		}				public String getKey ()		{			return property.key;		}				public PropertyList nextProperty ()		{			if (nextCalled) {				property = nextProperty;				nextProperty = findReturnablePropertyAtOrAfter (property.next);			} else				nextCalled = true;			return property;		}		public Object next ()		{			return nextProperty ();		}				public void remove ()		{			throw new UnsupportedOperationException ();		}					// Serialization 		// Iterator			private static final long serialVersionUID = 1;		private static final int CURRENT_SERIAL_VERSION = 0;				private void writeObject (ObjectOutputStream out) throws IOException {			out.writeInt (CURRENT_SERIAL_VERSION);			out.writeObject(property);			out.writeObject(nextProperty);			out.writeObject(deletedKeys);			out.writeBoolean(nextCalled);			out.writeBoolean(returnNumeric);			out.writeBoolean(returnObject);		}				private void readObject (ObjectInputStream in) throws IOException, ClassNotFoundException {			int version = in.readInt ();			property = (PropertyList) in.readObject();			nextProperty = (PropertyList) in.readObject();			deletedKeys = (HashSet) in.readObject();			nextCalled = in.readBoolean();			returnNumeric = in.readBoolean();			returnObject = in.readBoolean();		}	}	public class NumericIterator extends Iterator implements Serializable	{		public NumericIterator (PropertyList pl) {			super (pl);			this.returnObject = false;		}	}	public class ObjectIterator extends Iterator implements Serializable	{		public ObjectIterator (PropertyList pl) {			super (pl);			this.returnNumeric = false;		}	}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -