2015-12-26 8 views
5

compareToでソートされたツリーマップがAccountクラスにあります。キー値を追加した後にツリーマップをソートする方法

私はトリマップを初期化するときにソートされますが、この機能を使用すると(特定のアカウントに資金を追加するために)、変更された値がツリーマップの最初または最後でない場合にのみ機能します。

ここにコードがあります。私は間違って何をしていますか?

public static void deposit(TreeMap<Account,MyLinkedList<Customer>> map){ 
      boolean flag = false; 
      int num ; 
      int amount; 
      System.out.println("please enter account number"); 
      num = s.nextInt(); 
      //for(Iterator<Account> i = map.;i.hasNext()) 
      for(Map.Entry<Account, MyLinkedList <Customer>> entry : map.entrySet()){ 
       if(entry.getKey().getAccNumber() == num){ 
        flag = true; 
        System.out.println("Please enter amount"); 
        amount = s.nextInt(); 
        entry.getKey().setAccBalance(entry.getKey().getAccBalance()+amount); 

        Account temp = entry.getKey(); 
        MyLinkedList<Customer> tempList = entry.getValue(); 
        map.remove(entry.getKey()); 
        map.put(temp, tempList); 

        break; 
       } 
      } 
      if(flag == false) { 
       System.out.println("Account doesn't exist"); 
       return; 
      } 
     } 
    } 

答えて

2

特定の番号のアカウントを見つけるためにマップ全体を反復処理する必要がある場合は、マップを使用する目的を無効にします。

おそらく2つのマップが必要です。追加の地図はHashMap<Integer,Account>になり、一定時間内に口座番号でAccountを見つけることができます。あなたが与えられた口座番号のAccountを持っていたら、単一map.get(account)はあなたに対応する値を取得しますので、

これはこれは、あなたがに/からエントリを削除して追加することができます。(あなたがループを取り除くことができますあなたのTreeMapcompareToは使用しない限り、ところでエントリーセットを反復処理しながら、あなたが行うことができないTreeMap、(まあ、あなたは、エントリセットではなく、挿入を明示的に反復子を使用して削除を行うことができます)。

を既存のアカウントの残高を使用して注文を決定する場合は、ツリーマップからエントリを削除して、更新された残高を追加する必要はありません。

+0

まず、reply.iのおかげでアカウントの残高を使って注文を決めるので、削除して再度追加する必要があると思っていました。この新しいマップをどのように実装する必要がありますか?関数の中に? – KLTR

+0

@RoyLevyはい、削除してもう一度追加する必要があります。新しいMapについては、メソッドを呼び出すたびに作成すると効率的ではありません。メソッドの2番目の引数として渡すことを検討する必要があります。 – Eran

+0

しかし、新しいハッシュマップを使用して値を追加するにはどうすればよいですか?私はo(1)でアカウントを取得することができますが、ハッシュマップから値を追加する方法(キーはintegeなので)申し訳ありませんが、私はいくつかの愚かな質問を学生かもしれません:) – KLTR

関連する問題