2016-04-04 15 views
0

を通じて特別な順番で値を検索し、私はすでに私の問題のための実用的なソリューションを持っているが、それは私のために少しあまりにも多くのコードを思わので、多分あなたは、私が持つHas​​hMapを持っている:)より良いアイデアを持っています1000要素の限られたサイズ。 1つを追加したいときは、マップ内の関連するIntegerが最も小さいTを新しいものに置き換える必要があります。のJava:HashMapの<T, Integer>

私の現在のコードは次のとおりです。

public boolean add(T element) { 
    if (set.containsKey(element)) { 
     return false; 
    } else if (set.size() == length) { 
     Integer searchedInteger = set.values().stream().sorted().findFirst().get(); 
     T searchedElement = set.entrySet() 
       .stream() 
       .filter(x -> x.getValue().equals(searchedInteger)) 
       .findFirst() 
       .get() 
       .getKey(); 
     set.remove(searchedElement); 
     set.put(element, 0); 
     return true; 
    } 
    set.put(element, 0); 
    return true; 
} 

おかげ

+1

ザッツは条件文とリターンせずに多くのコード...その5のような行をイマイチ..... – redFIVE

+0

を行う)との終わりにtrueを返すことができますたぶん、より適切なhttp://codereview.stackexchange.com/ – Dimi

+1

ああおかげで私は、このセクション – Bajal

答えて

2

第1の改良あなたが作ることができsorted().findFirst()を避けるためです。 Streamのほとんどの実装では、この状況のすべての要素がソートされるので、それは不便です。代わりにminを使用する方がはるかに優れています。

また、二回のエントリを反復する必要はありません。あなたは(set.putを削除することができ、この

Map.Entry<T, Integer> e = set.entrySet() 
          .stream()          
          .min(Map.Entry.comparingByValue()) 
          .orElseThrow(IllegalStateException::new); 
set.remove(e.getKey()); 
+2

は、我々はまた、代わりに '' ... orElseThrow(...)の '...マップ(のMap.Entry ::のgetKey).ifPresent(設定::削除を)'のような何かを行うことができます。 (この特別なケースでは投げが私にもっと意味をなさないが) – Radiodef

+0

@Radiodef良い点。恥 'サプライヤー'と '消費者を'受け入れ方法はありません。 –

+0

ifPresentを実行するにはどうすればよいですか?それはset.entrySetを受け入れるdoes notの()。ストリームを()。マップ(のMap.Entry ::のgetKey).ifPresent(設定::削除) – PowerFlower

関連する問題