Как получить информацию из этой хеш-таблицы - PullRequest
0 голосов
/ 24 января 2012

Я постараюсь сделать это простым, но все же понятным. Если есть путаница, дайте мне знать!

Я получил эту хеш-таблицу:

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**   
}

Спасибо!

РЕДАКТИРОВАТЬ: Кстати, ребята, метод connect получил несколько проверок, но он довольно длинный, поэтому я не стал его вставлять, так как я знаю, что он отлично работает.

РЕДАКТИРОВАТЬ: Так как, кажется, с помощью return allChannels.get (канал), похоже, все правильно, с моим 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);
   }

Ответы [ 3 ]

5 голосов
/ 24 января 2012

Либо я упускаю что-то действительно очевидное, либо вы просто пропускаете ответ (который у вас уже есть в вашем коде!)

return allChannels.get(channel);

Одна вещь, которую вы должны учитывать, это то, что если вывызывая этот метод connectChannel снова и снова, вы будете постоянно уничтожать свой массив (так как вы вызываете новый для него каждый раз, когда вызываете этот метод), так что фактически каждый канал обречен на то, чтобы в нем всегда был один пользователь.

Вы должны проверить, является ли список массивов нулевым, а если нет, не пытайтесь повторно создать его экземпляр (если я не пропущу то, что вы пытаетесь сделать, что я вполне могу).

0 голосов
/ 24 января 2012

Ошибка в вашем методе 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);
}
0 голосов
/ 24 января 2012

Это должно работать

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

Эта строка (она у вас есть) работает аналогично - метод get() дает вам ArrayList, а затем вы добавляете элемент.

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