2017-05-02 20 views
0

複数のキーでグループ化できるかどうか確認したい。 、私は必要な動作をJavaカスタマイズされたグループ化と||条件

Name  id 

    David 123 
    David 456 
    Bryant 123 
    Ryan  456 
    Foo  555 
    Bar  555 

そして、私は意味

[(David, 123), (David, 456), (Bryant, 123), (Ryan, 456)] 
[(Foo, 555), (Bar, 555)] 

にグループにそれらをすることができます:

Class Something { 
    String name; 
    String id; 
} 

物事のリスト: のは、私はクラスを得たとしましょうクラス "equals"は名前かidのどちらかが同じでクラスが等しいので、

public boolean equals(Object o) { 
    Something that = (Something) o; 
    return this.name.equals(that.name) || this.id.equals(that.id); 
} 

しかし、関数equalsの問題は非推移的なので、対応するhashCode関数を書くことができません。

私は私は2つのハッシュマップを作成した場合、私は

Map<String, Something> idToSomething; 
Map<String, Something> nameToSomething; 

をすることによって、これを達成することができます今の質問はどのように私はそれらのものがでている場合と言う、コレクションを使用して、私がしたい動作を実現すべきであることを知っていますリストには、代と呼ばれるので、私は、私も変更できるようにしたい

somethings.stream().collect(Collectors.groupby(???)) 

ノートに似た何かを行うことができます?将来的に戦略別に異なるグループ分けを適用することで、将来的には名前またはIDでグループ化することができます。これについて移動する

+0

は、GoogleグアバのMultimapは –

答えて

0

一つの方法は、Collectors#groupingByに渡すと、使用するべきかを決定するために、グローバル変数を使用するように分類子として使用するFunction<? super Something, ? extends String>を決定する方法を作るために次のようになります。

private boolean shouldIdBeUsed = true; 

public Function<? super Something, ? extends String> getClassifier() { 
    if (shouldIdBeUsed) { 
     return Something::getId; 
    } 

    return Something::getName; 
} 

今、あなたは、単にパラメータとしてメソッドを渡すことができます。

somethings.stream().collect(Collectors.groupingBy(getClassifier())); 
+0

HMMで見たいと思うかもしれません...しかし、常に使用するのいずれかに使用するIDまたは名前になります。そのブール値は同時に真となる必要がありますか? –

+0

あなたが何を求めているのか分かりませんが、私は例を挙げました。ブール値を削除し、必要な条件を追加することができます。 –

関連する問題