Avatar billede alfabeta Nybegynder
18. februar 2004 - 08:39 Der er 9 kommentarer

java 1.1.8 (Linkedlist)

I forbindelse med jeg er ved at lave en chat der skal kunne blive kompileret i java 1.1.8 skal jeg bruge en linkedlist

Hvilke filer skal jeg hente/include for at kunne benytte linkedliste i mit program.
Avatar billede arne_v Ekspert
18. februar 2004 - 08:48 #1
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 !
Avatar billede 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 &lt; 0 || index &gt; 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 &lt; 0 || index &gt;= 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 &lt; 0 || index &gt;= 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 &lt; 0 || index &gt; 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 &lt; 0 || index &gt;= 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 &lt; 0 || index &gt; 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;
    }

    public void add(Object o) {
        checkForComodification();
        lastReturned = header;
        addBefore(o, next);
        nextIndex++;
        expectedModCount++;
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }
    }

    private static class Entry {
    Object element;
    Entry next;
    Entry previous;

    Entry(Object element, Entry next, Entry previous) {
        this.element = element;
        this.next = next;
        this.previous = previous;
    }
    }

    private Entry addBefore(Object o, Entry e) {
    Entry newEntry = new Entry(o, e, e.previous);
    newEntry.previous.next = newEntry;
    newEntry.next.previous = newEntry;
    size++;
    modCount++;
    return newEntry;
    }

    private void remove(Entry e) {
    if (e == header)
        throw new NoSuchElementException();

    e.previous.next = e.next;
    e.next.previous = e.previous;
    size--;
    modCount++;
    }

    /**
    * 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();

        // Read in size
        int size = s.readInt();

        // Initialize header
        header = new Entry(null, null, null);
        header.next = header.previous = header;

    // Read in all elements in the proper order.
    for (int i=0; i<size; i++)
            add(s.readObject());
    }
}
Avatar billede arne_v Ekspert
18. februar 2004 - 10:46 #3
corholio>

Overvej:

extends AbstractSequentialList implements List
Avatar billede arne_v Ekspert
18. februar 2004 - 10:48 #4
(jeg formoder at du har checket licens forholdene for den kode)
Avatar billede alfabeta Nybegynder
19. februar 2004 - 07:58 #5
Prøver lige :-) (Er ikke så skrap til Java endnu)
Avatar billede alfabeta Nybegynder
19. februar 2004 - 08:32 #6
Kan ikke kompile skidtet.

Er der en anden måde at jeg kan lave en server på end ved hjælp af en linkedliste.

Serveren skal kunne gøre følgende:

Sende en komplet liste af brugere ved hjælp af en besked fra brugeren:
'##$$SendBrugerliste##'

Når en bruger sender en besked skal alle have den lige meget om den er privat eller ej:
'##$$Fra_lars,,,,til_ALLE##'  '##$$Fra_lars,,,,til_Susanne##'

Derudover skal serveren sende en besked til alle når en bruger logger sig ind/ud:
'##$$Lars_ind##'/'##$$Lars_ud##'
Avatar billede alfabeta Nybegynder
19. februar 2004 - 08:34 #7
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å.
Avatar billede alfabeta Nybegynder
19. februar 2004 - 14:33 #8
Nu har jeg lavet en server der virker men min klient halter lidt.
Listen hvorbeskederne skrives i bliver ikke opdateret.

Jeg kan se på serveren at beskederne sendes fra appleten men de bliver ikke vist hvad gør jeg forkert. Køre metoden run ikke automatisk ?

///////////////////////////////////////
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;

  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
 
  public CoolChat(){};

  public void run() {
 
try {
          String line = i.readUTF ();
          output.add(line);
          repaint();
      }//try
      catch (IOException ex) {
        ex.printStackTrace ();
      }
  }//run

  public void init (){

  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);
   
    button.setLabel("Send a");
    button.addActionListener(this);
    add(button, null);
  }//init

  public void paint(Graphics g){
 
  }//paint

  public void actionPerformed(ActionEvent actionevent){
    try
      {
        o.writeUTF ((String) input.getText());
        o.flush();         
        input.setText("");
      }
    catch(Exception exception)
      {
        exception.printStackTrace();
      }
  }//actionperformed
 
}//slut
Avatar billede arne_v Ekspert
19. februar 2004 - 14:40 #9
Det plejer kun at være init som bliver kaldt for applets.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester