Использование Hashtable, Arraylist. Получение информации от них - PullRequest
1 голос
/ 19 января 2012

У меня есть чат-программа, которая содержит пользователей и каналы. Мой следующий квест - получить список каналов, в которых участвует один пользователь. Как это сделать?

Вот коды на данный момент:

ChatFrontImpl:

private Hashtable<String, ArrayList<String>> channels = new Hashtable<String, ArrayList<String>>();
private ArrayList<Client> clients;

public synchronized boolean registerClient(Client client, String password) throws RemoteException {
if(!u.logIn(client.findName(), password)){
    System.out.println("Wrong username or password!");
    return false;
}
if (!clients.contains(client)) {
    try {
        clients.add(client);
        updateJlist();
        System.out.println(client.findName() + " registered.");
    } 
    catch (Exception e){
        System.out.println("error in method registerClient(): " + e);
    }
    return true;
}else
    return false;
} 

public void connectChannel(String username, String channel) throws RemoteException{ 
    if(isUserRegistered(username)){
        if (!channels.containsKey(channel)) {
            String message = "User " + username + " entered the channel";
            channels.put(channel, new ArrayList<String>());
            channels.get(channel).add(username);
            notifyChannelSystem(channel, "SYSTEM", message);
            notifySelf(username, "Write /? for avaliable commands");
        }
        else{
            if(channels.get(channel).contains(username)){ 
            } 
            else {
                channels.get(channel).add(username);
                String message = "User " + username + " just entered the channel";
                notifyChannelSystem(channel, "SYSTEM", message);        
          }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 19 января 2012

Я бы использовал другую структуру данных - но при условии, что вы хотите продолжить с этой (чтобы ответить на вопрос):

public List<String> getChannelsForUsername(String username) {
    List<String> userChannels = new ArrayList<String>();
    for (String channel : channels.keySet()) {
        if (channels.get(channel).contains(username)) {
            userChannels.add(channel);
        }
    }
    return userChannels;
}
1 голос
/ 19 января 2012

Есть карта

private HashMap<Client, channlesList> clientsAndRooms;
private ArrayList channels = ArrayList <channel>();

Я не знаю, почему у вас есть хеш-таблица, я бы постарался ее избежать.

при подключении пользователя к каналу

1) проверить, есть ли у пользователя hasmap тот пользователь Вы можете получить набор ключей и сделать Содержит. Если есть, добавьте channelList и новый канал в этот список и снова сохраните его на карте. 2) Если это первый канал,

channelList.add(channel);
clientAndRooms.put(userName,channelList);

Примечание: могут быть синтаксические ошибки, я просто набрал его здесь.

...