2012-01-19 7 views
1

私はユーザーとチャンネルを含むチャットプログラムを持っています。私の次のクエストは、1人のユーザーがいるチャンネルの一覧を取得することです。これはどのように行う必要がありますか?Hashtable、Arraylistを使用しています。彼らからの情報の取得

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

あなたは変数の定義が含まれるようにあなたの質問を展開することができます**カナル**してください。 ** kanal **を実際に** channel **にする必要がある場合、プログラムは意味があります。 –

+0

ああ、コードは通常ノルウェー語ですが、私は翻訳しました(明らかにその一部です)。変数はkanal ofcと書かれているどこでもチャンネルでなければなりません:) – sindrem

+0

変数を修正してメソッドをvoidに変更しました。本当に返す必要はありません。 – sindrem

答えて

1

私は別のデータ構造を使用したい - しかし、あなたは(質問に答えるために)この1を継続したいと仮定:

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; 
} 
+0

ありがとうございました:) – sindrem

+0

これは本当ですか?私は列挙型を使ってチャンネルリストを調べるべきではありませんか? – sindrem

+0

'パブリックリスト getChannelsForUsername(文字列名){ リスト userChannels =新しいArrayListを()。 for(列挙型e = channels.elements(); e.hasMoreElements();){ if(channels.get(channels).contains(username)){ userChannels.add(channels); } } 返信userChannels; } ' このようなものではありませんか?私はひどいエラーthoを得ている。 私は.add(チャンネル)を使用することはできません。しかし、私はちょっと奇妙なユーザー名を追加することができます – sindrem

1

持って、私はあなたがそこにハッシュテーブルを持っている理由、私は希望を知らないマップ

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

それを避けてください。

チャネル

1にユーザーを接続中)hasmapがすでにユーザー がキーセットを取得することができますし、入っていませんことを持っているかどうかを確認。存在する場合は、このリストにchannelListとnew channelを取得し、再びマップに保存します。これが最初のチャネルがある場合 2)、

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

注:私はちょうどそれをここに入力された、構文エラーがあるかもしれません。

+0

私はこの構造が私より優れていると確信していますか? – sindrem

+0

ハッシュテーブルがビジネスに悪い場合は、このコードに変更しようとする可能性があります – sindrem

+0

ハッシュテーブルは同期HashMapsです。同時実行性の影響を受けることを考えれば、私はHashtableに固執するか、ConcurrentHashMapに移動します。 –

関連する問題