【问题标题】:How to get info from this hashtable如何从此哈希表中获取信息
【发布时间】:2012-02-17 15:22:21
【问题描述】:

我会尽量保持简单,但仍然可以理解。如果有任何困惑,请告诉我!

我得到了这个哈希表:

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);
}

现在我想使用此方法,以获取用户连接到给定频道(参数)的数组列表。这怎么可能?

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

谢谢!

编辑:顺便说一句,connectmethod 进行了多次检查,但它很长,所以我没有费心粘贴它,因为我知道它工作得很好。

编辑:由于使用 return allChannels.get(channel) 似乎是正确的,所以我的 JList 肯定有其他问题。我在 GUILogic 中使用了这些方法来运行 JList。我已经让另外 2 个 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);
   }

【问题讨论】:

    标签: java swing arraylist hashtable


    【解决方案1】:

    要么我遗漏了一些非常明显的东西,要么你只是忽略了答案(你的代码中已经有了答案!)

    return allChannels.get(channel);
    

    您应该考虑的一件事是,如果您一遍又一遍地调用此 connectChannel 方法,您将不断地破坏您的数组列表(因为您在其上调用 new,每次调用该方法时),所以实际上每个频道注定永远只有一个用户。

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

    【讨论】:

    • 我得到了那个有盖的伙伴 :) 我只是没有粘贴所有代码。 if (!allChannels.containsKey(channel)) 所以,我已经 return allChannels.get(channel);实际上,所以肯定有其他问题。带有 usersInChannel 的 JList 显示在线的每个人。
    • 这很像 IRC,您可以在其中输入一个频道,然后您就可以看到您在列表中输入的同一频道中的其他所有人。在我的情况下是一个 JList
    【解决方案2】:

    这应该可以工作

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

    这条线(你有它)的工作方式相同 - get() 方法给你ArrayList 然后你添加一个项目。

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

    【讨论】:

    • 是的,我也是这么想的。我想还有其他问题。我在我的 JList 上做了一个系统输出,它运行这个 usersInChannelJList.setModel(gl.getUsersInChannelAsDefaultListModel());我至少知道 System.out.println(gl.getChannel());返回用户所在的实际频道,所以这不应该是问题
    【解决方案3】:

    您的 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);
    }
    

    【讨论】:

    • 我把那个方法整理好了,我只是没有粘贴所有的代码。尽量使零件工作简单。我只是想看看我如何将用户添加到频道中会有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多