如何从此哈希表中获取信息

时间:2012-01-24 11:13:06

标签: java swing arraylist hashtable

我试着保持这个简单,但仍然可以理解。如果有任何混淆,请告诉我!

我得到了这个哈希表:

private Hashtable<String, ArrayList<String>> allChannels = new Hashtable<String, ArrayList<String>>();

我正在使用此方法插入客户端/用户:

public void connectChannel(String username, String channel) throws RemoteException{
    allChannels.put(channel, new ArrayList<String>());
    allChannels.get(channel).add(username);
}

现在我想使用这个方法,以获得一个连接到给定通道(参数)的用户的arraylist。怎么可以这样做?

@Override
public ArrayList<String> getUsersInChannel(String channel) throws RemoteException{
    return **Code needed**   
}

谢谢!

编辑:顺便说一下,联系方法得到了几个检查,但它很长,所以我没有费心去粘贴它,因为我知道它工作得很好。

编辑:因为使用return allChannels.get(channel)来看似乎是正确的,所以我的JList还有其他问题。我在GUILogic中使用了这些方法来运行JList。我已经让另外两个JList以相同的方式工作了。

DefaultListModel usersInChanDLM = new DefaultListModel();

public DefaultListModel getUsersInChannelAsDefaultListModel() throws RemoteException{
    if(!(getChannel() == null)){
        for(String a : cf.getUsersInChannel(getChannel())){
            usersInChanDLM.addElement(a);
            System.out.println(a);
        }
    }
    return usersInChanDLM;
}

void updateUsersInChannelJlist(JList jList3) throws RemoteException {
    usersInChanDLM.clear();
    usersInChanDLM.removeAllElements();
    for(Client c : cf.getClients()){
        if(!(usersInChanDLM.contains(c.findName()))){
            usersInChanDLM.addElement(c.findName());
        }
    }
    jList3.setModel(usersInChanDLM);
}

所以,我很明显能够看到最后一种方法是搞砸了,因为它添加了列表中的所有客户端。但是应该怎么说呢?

解决方案:

所以,我做到了!

    public void updateUsersInChannelJlist(JList jList3) throws RemoteException {
        usersInChanDLM.clear();
        usersInChanDLM.removeAllElements();
        for(String s : cf.getUsersInChannel(channel)){
            if(!(usersInChanDLM.contains(s))){
                usersInChanDLM.addElement(s);
            }
        }
        jList3.setModel(usersInChanDLM);
   }

3 个答案:

答案 0 :(得分:5)

要么我错过了一些非常明显的东西,要么你只是忽略了答案(你已经在代码中找到了答案!)

return allChannels.get(channel);

你应该考虑的一件事是,如果你一遍又一遍地调用这个connectChannel方法,你将不断地破坏你的arraylist(因为你每次调用那个方法时都会调用new),所以实际上每个频道注定一直有一个用户。

您应该检查数组列表是否为空,如果不是,请不要再重新实例化(除非我错过了您尝试做的事情,我很可能会这样做)。

答案 1 :(得分:0)

这应该有效

@Override
public ArrayList<String> getUsersInChannel(String channel) throws RemoteException{
    return allChannels.get(channel);   
}

这一行(你有它)的工作方式相同 - get()方法为你提供ArrayList而不是你添加一个项目。

allChannels.get(channel).add(username);

答案 2 :(得分:0)

您的connectChannel方法出错。您不应每次都创建ArrayList。

public void connectChannel(String username, String channel) throws RemoteException{
    ArrayList<String> ch = allChannels.get(channel);
    if (ch==null){
        ch = new ArrayList<String>();
        allChannels.put(channel, ch);
    }   
    ch.add(username);
}