Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
java.util.LinkedList er først med i Java fra version 1.2, så du bliver nødt til at implementere din egen linked list !
Synes godt om
Slettet bruger
18. februar 2004 - 10:28#2
Værsgo... jeg snippede lige koden fra src.zip i min java installation....
/* * @(#)LinkedList.java 1.46 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */
package java.util;
/** * Linked list implementation of the <tt>List</tt> interface. Implements all * optional list operations, and permits all elements (including * <tt>null</tt>). In addition to implementing the <tt>List</tt> interface, * the <tt>LinkedList</tt> class provides uniformly named methods to * <tt>get</tt>, <tt>remove</tt> and <tt>insert</tt> an element at the * beginning and end of the list. These operations allow linked lists to be * used as a stack, queue, or double-ended queue (deque).<p> * * All of the stack/queue/deque operations could be easily recast in terms of * the standard list operations. They're included here primarily for * convenience, though they may run slightly faster than the equivalent List * operations.<p> * * All of the operations perform as could be expected for a doubly-linked * list. Operations that index into the list will traverse the list from * the begining or the end, whichever is closer to the specified index.<p> * * <b>Note that this implementation is not synchronized.</b> If multiple * threads access a list concurrently, and at least one of the threads * modifies the list structurally, it <i>must</i> be synchronized * externally. (A structural modification is any operation that adds or * deletes one or more elements; merely setting the value of an element is not * a structural modification.) This is typically accomplished by * synchronizing on some object that naturally encapsulates the list. If no * such object exists, the list should be "wrapped" using the * Collections.synchronizedList method. This is best done at creation time, * to prevent accidental unsynchronized access to the list: <pre> * List list = Collections.synchronizedList(new LinkedList(...)); * </pre><p> * * The iterators returned by the this class's <tt>iterator</tt> and * <tt>listIterator</tt> methods are <i>fail-fast</i>: if the list is * structurally modified at any time after the iterator is created, in any way * except through the Iterator's own <tt>remove</tt> or <tt>add</tt> methods, * the iterator will throw a <tt>ConcurrentModificationException</tt>. Thus, * in the face of concurrent modification, the iterator fails quickly and * cleanly, rather than risking arbitrary, non-deterministic behavior at an * undetermined time in the future. * * <p>Note that the fail-fast behavior of an iterator cannot be guaranteed * as it is, generally speaking, impossible to make any hard guarantees in the * presence of unsynchronized concurrent modification. Fail-fast iterators * throw <tt>ConcurrentModificationException</tt> on a best-effort basis. * Therefore, it would be wrong to write a program that depended on this * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i><p> * * This class is a member of the * <a href="{@docRoot}/../guide/collections/index.html"> * Java Collections Framework</a>. * * @author Josh Bloch * @version 1.46, 01/23/03 * @see List * @see ArrayList * @see Vector * @see Collections#synchronizedList(List) * @since 1.2 */
public class LinkedList extends AbstractSequentialList implements List, Cloneable, java.io.Serializable { private transient Entry header = new Entry(null, null, null); private transient int size = 0;
/** * Constructs an empty list. */ public LinkedList() { header.next = header.previous = header; }
/** * Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * * @param c the collection whose elements are to be placed into this list. * @throws NullPointerException if the specified collection is null. */ public LinkedList(Collection c) { this(); addAll(c); }
/** * Returns the first element in this list. * * @return the first element in this list. * @throws NoSuchElementException if this list is empty. */ public Object getFirst() { if (size==0) throw new NoSuchElementException();
return header.next.element; }
/** * Returns the last element in this list. * * @return the last element in this list. * @throws NoSuchElementException if this list is empty. */ public Object getLast() { if (size==0) throw new NoSuchElementException();
return header.previous.element; }
/** * Removes and returns the first element from this list. * * @return the first element from this list. * @throws NoSuchElementException if this list is empty. */ public Object removeFirst() { Object first = header.next.element; remove(header.next); return first; }
/** * Removes and returns the last element from this list. * * @return the last element from this list. * @throws NoSuchElementException if this list is empty. */ public Object removeLast() { Object last = header.previous.element; remove(header.previous); return last; }
/** * Inserts the given element at the beginning of this list. * * @param o the element to be inserted at the beginning of this list. */ public void addFirst(Object o) { addBefore(o, header.next); }
/** * Appends the given element to the end of this list. (Identical in * function to the <tt>add</tt> method; included only for consistency.) * * @param o the element to be inserted at the end of this list. */ public void addLast(Object o) { addBefore(o, header); }
/** * Returns <tt>true</tt> if this list contains the specified element. * More formally, returns <tt>true</tt> if and only if this list contains * at least one element <tt>e</tt> such that <tt>(o==null ? e==null * : o.equals(e))</tt>. * * @param o element whose presence in this list is to be tested. * @return <tt>true</tt> if this list contains the specified element. */ public boolean contains(Object o) { return indexOf(o) != -1; }
/** * Returns the number of elements in this list. * * @return the number of elements in this list. */ public int size() { return size; }
/** * Appends the specified element to the end of this list. * * @param o element to be appended to this list. * @return <tt>true</tt> (as per the general contract of * <tt>Collection.add</tt>). */ public boolean add(Object o) { addBefore(o, header); return true; }
/** * Removes the first occurrence of the specified element in this list. If * the list does not contain the element, it is unchanged. More formally, * removes the element with the lowest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt> (if such an * element exists). * * @param o element to be removed from this list, if present. * @return <tt>true</tt> if the list contained the specified element. */ public boolean remove(Object o) { if (o==null) { for (Entry e = header.next; e != header; e = e.next) { if (e.element==null) { remove(e); return true; } } } else { for (Entry e = header.next; e != header; e = e.next) { if (o.equals(e.element)) { remove(e); return true; } } } return false; }
/** * Appends all of the elements in the specified collection to the end of * this list, in the order that they are returned by the specified * collection's iterator. The behavior of this operation is undefined if * the specified collection is modified while the operation is in * progress. (This implies that the behavior of this call is undefined if * the specified Collection is this list, and this list is nonempty.) * * @param c the elements to be inserted into this list. * @return <tt>true</tt> if this list changed as a result of the call. * @throws NullPointerException if the specified collection is null. */ public boolean addAll(Collection c) { return addAll(size, c); }
/** * Inserts all of the elements in the specified collection into this * list, starting at the specified position. Shifts the element * currently at that position (if any) and any subsequent elements to * the right (increases their indices). The new elements will appear * in the list in the order that they are returned by the * specified collection's iterator. * * @param index index at which to insert first element * from the specified collection. * @param c elements to be inserted into this list. * @return <tt>true</tt> if this list changed as a result of the call. * @throws IndexOutOfBoundsException if the specified index is out of * range (<tt>index < 0 || index > size()</tt>). * @throws NullPointerException if the specified collection is null. */ public boolean addAll(int index, Collection c) { Object[] a = c.toArray(); int numNew = a.length; if (numNew==0) return false; modCount++;
Entry successor = (index==size ? header : entry(index)); Entry predecessor = successor.previous; for (int i=0; i<numNew; i++) { Entry e = new Entry(a[i], successor, predecessor); predecessor.next = e; predecessor = e; } successor.previous = predecessor;
size += numNew; return true; }
/** * Removes all of the elements from this list. */ public void clear() { modCount++; header.next = header.previous = header; size = 0; }
// Positional Access Operations
/** * Returns the element at the specified position in this list. * * @param index index of element to return. * @return the element at the specified position in this list. * * @throws IndexOutOfBoundsException if the specified index is is out of * range (<tt>index < 0 || index >= size()</tt>). */ public Object get(int index) { return entry(index).element; }
/** * Replaces the element at the specified position in this list with the * specified element. * * @param index index of element to replace. * @param element element to be stored at the specified position. * @return the element previously at the specified position. * @throws IndexOutOfBoundsException if the specified index is out of * range (<tt>index < 0 || index >= size()</tt>). */ public Object set(int index, Object element) { Entry e = entry(index); Object oldVal = e.element; e.element = element; return oldVal; }
/** * Inserts the specified element at the specified position in this list. * Shifts the element currently at that position (if any) and any * subsequent elements to the right (adds one to their indices). * * @param index index at which the specified element is to be inserted. * @param element element to be inserted. * * @throws IndexOutOfBoundsException if the specified index is out of * range (<tt>index < 0 || index > size()</tt>). */ public void add(int index, Object element) { addBefore(element, (index==size ? header : entry(index))); }
/** * Removes the element at the specified position in this list. Shifts any * subsequent elements to the left (subtracts one from their indices). * Returns the element that was removed from the list. * * @param index the index of the element to removed. * @return the element previously at the specified position. * * @throws IndexOutOfBoundsException if the specified index is out of * range (<tt>index < 0 || index >= size()</tt>). */ public Object remove(int index) { Entry e = entry(index); remove(e); return e.element; }
/** * Return the indexed entry. */ private Entry entry(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size); Entry e = header; if (index < (size >> 1)) { for (int i = 0; i <= index; i++) e = e.next; } else { for (int i = size; i > index; i--) e = e.previous; } return e; }
// Search Operations
/** * Returns the index in this list of the first occurrence of the * specified element, or -1 if the List does not contain this * element. More formally, returns the lowest index i such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if * there is no such index. * * @param o element to search for. * @return the index in this list of the first occurrence of the * specified element, or -1 if the list does not contain this * element. */ public int indexOf(Object o) { int index = 0; if (o==null) { for (Entry e = header.next; e != header; e = e.next) { if (e.element==null) return index; index++; } } else { for (Entry e = header.next; e != header; e = e.next) { if (o.equals(e.element)) return index; index++; } } return -1; }
/** * Returns the index in this list of the last occurrence of the * specified element, or -1 if the list does not contain this * element. More formally, returns the highest index i such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if * there is no such index. * * @param o element to search for. * @return the index in this list of the last occurrence of the * specified element, or -1 if the list does not contain this * element. */ public int lastIndexOf(Object o) { int index = size; if (o==null) { for (Entry e = header.previous; e != header; e = e.previous) { index--; if (e.element==null) return index; } } else { for (Entry e = header.previous; e != header; e = e.previous) { index--; if (o.equals(e.element)) return index; } } return -1; }
/** * Returns a list-iterator of the elements in this list (in proper * sequence), starting at the specified position in the list. * Obeys the general contract of <tt>List.listIterator(int)</tt>.<p> * * The list-iterator is <i>fail-fast</i>: if the list is structurally * modified at any time after the Iterator is created, in any way except * through the list-iterator's own <tt>remove</tt> or <tt>add</tt> * methods, the list-iterator will throw a * <tt>ConcurrentModificationException</tt>. Thus, in the face of * concurrent modification, the iterator fails quickly and cleanly, rather * than risking arbitrary, non-deterministic behavior at an undetermined * time in the future. * * @param index index of first element to be returned from the * list-iterator (by a call to <tt>next</tt>). * @return a ListIterator of the elements in this list (in proper * sequence), starting at the specified position in the list. * @throws IndexOutOfBoundsException if index is out of range * (<tt>index < 0 || index > size()</tt>). * @see List#listIterator(int) */ public ListIterator listIterator(int index) { return new ListItr(index); }
private class ListItr implements ListIterator { private Entry lastReturned = header; private Entry next; private int nextIndex; private int expectedModCount = modCount;
ListItr(int index) { if (index < 0 || index > size) throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size); if (index < (size >> 1)) { next = header.next; for (nextIndex=0; nextIndex<index; nextIndex++) next = next.next; } else { next = header; for (nextIndex=size; nextIndex>index; nextIndex--) next = next.previous; } }
public boolean hasNext() { return nextIndex != size; }
public Object next() { checkForComodification(); if (nextIndex == size) throw new NoSuchElementException();
lastReturned = next; next = next.next; nextIndex++; return lastReturned.element; }
public boolean hasPrevious() { return nextIndex != 0; }
public Object previous() { if (nextIndex == 0) throw new NoSuchElementException();
lastReturned = next = next.previous; nextIndex--; checkForComodification(); return lastReturned.element; }
public int nextIndex() { return nextIndex; }
public int previousIndex() { return nextIndex-1; }
public void remove() { checkForComodification(); try { LinkedList.this.remove(lastReturned); } catch (NoSuchElementException e) { throw new IllegalStateException(); } if (next==lastReturned) next = lastReturned.next; else nextIndex--; lastReturned = header; expectedModCount++; }
public void set(Object o) { if (lastReturned == header) throw new IllegalStateException(); checkForComodification(); lastReturned.element = o; }
/** * Returns a shallow copy of this <tt>LinkedList</tt>. (The elements * themselves are not cloned.) * * @return a shallow copy of this <tt>LinkedList</tt> instance. */ public Object clone() { LinkedList clone = null; try { clone = (LinkedList)super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(); }
// Put clone into "virgin" state clone.header = new Entry(null, null, null); clone.header.next = clone.header.previous = clone.header; clone.size = 0; clone.modCount = 0;
// Initialize clone with our elements for (Entry e = header.next; e != header; e = e.next) clone.add(e.element);
return clone; }
/** * Returns an array containing all of the elements in this list * in the correct order. * * @return an array containing all of the elements in this list * in the correct order. */ public Object[] toArray() { Object[] result = new Object[size]; int i = 0; for (Entry e = header.next; e != header; e = e.next) result[i++] = e.element; return result; }
/** * Returns an array containing all of the elements in this list in * the correct order; the runtime type of the returned array is that of * the specified array. If the list fits in the specified array, it * is returned therein. Otherwise, a new array is allocated with the * runtime type of the specified array and the size of this list.<p> * * If the list fits in the specified array with room to spare * (i.e., the array has more elements than the list), * the element in the array immediately following the end of the * collection is set to null. This is useful in determining the length * of the list <i>only</i> if the caller knows that the list * does not contain any null elements. * * @param a the array into which the elements of the list are to * be stored, if it is big enough; otherwise, a new array of the * same runtime type is allocated for this purpose. * @return an array containing the elements of the list. * @throws ArrayStoreException if the runtime type of a is not a * supertype of the runtime type of every element in this list. * @throws NullPointerException if the specified array is null. */ public Object[] toArray(Object a[]) { if (a.length < size) a = (Object[])java.lang.reflect.Array.newInstance( a.getClass().getComponentType(), size); int i = 0; for (Entry e = header.next; e != header; e = e.next) a[i++] = e.element;
if (a.length > size) a[size] = null;
return a; }
private static final long serialVersionUID = 876323262645176354L;
/** * Save the state of this <tt>LinkedList</tt> instance to a stream (that * is, serialize it). * * @serialData The size of the list (the number of elements it * contains) is emitted (int), followed by all of its * elements (each an Object) in the proper order. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out any hidden serialization magic s.defaultWriteObject();
// Write out size s.writeInt(size);
// Write out all elements in the proper order. for (Entry e = header.next; e != header; e = e.next) s.writeObject(e.element); }
/** * Reconstitute this <tt>LinkedList</tt> instance from a stream (that is * deserialize it). */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in any hidden serialization magic s.defaultReadObject();
Selve besked delen styrer 100% i klienten, det eneste serveren har ansvaret for er at kunne sende en brugerliste til en bruger ud fra en forespørgsel, samt sende besked til alle når bruger logger af/på.
public class CoolChat extends Applet implements ActionListener { //public var //grafik public List output; public TextField input; public Button button; public String besked; public DataInputStream i; public DataOutputStream o; //protected //communikation protected InputStream ai; protected OutputStream ao; //var slut
try { Socket s = new Socket("81.19.239.46",2000); i = new DataInputStream(new BufferedInputStream(s.getInputStream())); o = new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); } catch(Exception exception) { exception.printStackTrace(); }
besked = "True"; button = new Button(); output = new List(); input = new TextField(); input.setColumns(50); add(output,null); add(input,null);
Det plejer kun at være init som bliver kaldt for applets.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.