下面聊天室的程序源代码中用户的信息用了两个类Node类和UserLinkList类来实现。
可不可以只用一个类来实现这些功能呢?用LinkedList类实现可以吗?谢谢!Node.java
import java.net.*;
import java.io.*;/**
 *用户链表(单链表)的结点类,定义了链表中的用户。
 */
public class Node {
String username = null;
Socket socket = null;
ObjectOutputStream output = null;
ObjectInputStream input = null;

Node next = null;
}UserLinkList.java
/**
 * 用户链表结点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据
 * 用户名查找用户、根据索引查找这5个方法
 */
public class UserLinkList {
Node root;
Node pointer;
int count;

/**
 * 构造用户链表
 */
public UserLinkList(){
root = new Node();
root.next = null;
pointer = null;
count = 0;
}

/**
 * 添加用户
 */
public void addUser(Node n){
pointer = root;

while(pointer.next != null){
pointer = pointer.next;
}

pointer.next = n;
n.next = null;
count++;

}

/**
 * 删除用户
 */
public void delUser(Node n){
pointer = root;

while(pointer.next != null){
if(pointer.next == n){
pointer.next = n.next;
count --;

break;
}

pointer = pointer.next;
}
}

/**
 * 返回用户数
 */
public int getCount(){
return count;
}

/**
 * 根据用户名查找用户
 */
public Node findUser(String username){
if(count == 0) return null;

pointer = root;

while(pointer.next != null){
pointer = pointer.next;

if(pointer.username.equalsIgnoreCase(username)){
return pointer;
}
}

return null;
}

/**
 * 根据索引查找用户
 */
public Node findUser(int index){
if(count == 0) {
return null;
}

if(index <  0) {
return null;
}

pointer = root;

int i = 0;
while(i < index + 1){
if(pointer.next != null){
pointer = pointer.next;
}
else{
return null;
}

i++;
}

return pointer;
}
}

解决方案 »

  1.   

    class User{
        String name;
    }class UserList{
        private LinkedList<User> users;
        
        public UserList(){
    users = new LinkedList();
        }
        
        public void addUser(User user){
    users.add(user);
        }
        
        public int getCount(){
    return users.size();
        }
        
        public User findUser(String name){
    for(User user:users){
        if(user.name.equals(name)){
    return user;
        }
    }
    return null;
        }
    }
      

  2.   

    答:用LinkedList类实现可以吗?当然可以啊.
    可不可以只用一个类来实现这些功能呢?只要定义一个class User{..}来表示一个用户就行了.(但要注意:要重写类User中的equals方法,即:当两个User对象的name相同时返回true,否则返回false就行了
    )
      

  3.   

    很感谢,可是当把代码放到Eclipse中时,
    private LinkedList <User> users;出现错误提示如下:
    -The type LinkedList is not generic; it cannot be parameterized with arguments<User>
    -Syntax error,parameterized types are only available if source level is 5.0
    用的是Eclipse 3.2.2,JDK是1.6.0啊,为什么会出现这种情况呢?以前听说过这种问题主要是Eclipse自身有一个JRE,但我忘了怎么改了,请问怎么改呢?谢谢!
      

  4.   

    右键点击响应项目,选择build path就可以设置响应的jdk和引入库文件
      

  5.   

    右键点击响应项目,选择build path   使用jdk自带的jre,别使用Eclipse的
      

  6.   

    答:project->properties->左边选择:java compiler  右边选择:Enable project specific settings 在它下边选择的"Compiler compliance level:"的右边下拉框中选择:5.0或者6.0 最后单击"apply"
      

  7.   

    再问一个问题就结贴,分值30,
    为什么我的下面这段代码在dos黑窗口编译输出显示的窗体是设定的图标"icon.gif",而在Eclipse窗口中输出的却仍然是Java的咖啡杯标识。
    public class ChatServer extends JFrame{
        public static void main(String[] args) {
            new ChatServer();
        }    public ChatServer() {
    Toolkit kit = Toolkit.getDefaultToolkit();
    Image img = kit.getImage("icon.gif");
            this.setIconImage(img);
        }
    }
       
      

  8.   

    答:不可能啊.我在Eclipse窗口下运行时,输出显示的窗体的图标就是程序中设定的图标啊.
    代码片断: Toolkit toolkit = Toolkit.getDefaultToolkit();
    image = toolkit.getImage("c:/t1.jpg");//装入图标文件
    MediaTracker mediaTracker = new MediaTracker(this);
    mediaTracker.addImage(image, 0);
    try
    {
    mediaTracker.waitForID(0);
    }
    catch (InterruptedException ie)
    {
    System.err.println(ie);
    System.exit(1);
    }
      
            System.out.println("icon:"+image+" wid:"+image.getWidth(null)+"  hei:"+ image.getHeight(null));
            this.setIconImage(image);
      

  9.   


    MediaTracker mediaTracker = new MediaTracker(this);
            mediaTracker.addImage(image, 0);
            try
            {
                mediaTracker.waitForID(0);
            }
            catch (InterruptedException ie)
            {
                System.err.println(ie);
                System.exit(1);
            }
      
            System.out.println("icon:"+image+" wid:"+image.getWidth(null)+"  hei:"+ image.getHeight(null));这一大段代码起什么作用呢?貌似无关,难道我的程序中因为没有这一段而没法将图标显示出来?
      

  10.   

    答:这一大段的代码作用是: 由于 image = toolkit.getImage("c:/t1.jpg");//装入图标文件
    这个动作是启动另外一个线程来异步装入的,
    与你的下一个动作: this.setIconImage(img); 是并发执行的.   因此:完全可能在:setIconImage(img); 时,由于img还没有准备好(此时:img实际是null),从而导致仍是默认的icon.我有几次都是遇到这种情况.
    而加上:这一段代码,含义是:等待装入Image的线程完全装载入image之后(此时:img是有效时),才继续执行:  this.setIconImage(img); 
    注:有时:不同的图形文件类型,有些是不能作为icon设置的.如:t1.bmp类型文件,我在setIconImage(img); 时就没有成功.(原因待定)
      

  11.   

    t1.bmp类型文件,我在setIconImage(img); 时就没有成功.(可以肯定img不是null.因此:原因待定) 此时仍是默认的icon.