質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

21253閲覧

Java8のStreamを使ったList重複削除の方法を知りたい

kentaro_inoue

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/01/23 14:48

java8のStreamを学習しています。
試しにjava8のStreamを使ってListの重複した値をもつアイテムを除去したいのですが、どのように記述すれば可能でしょうか?
ご教示頂けたら幸いで御座います。
何卒よろしくお願い申し上げます。

java

1public class Entity 2{ 3 public String id; 4 public String name; 5} 6 7public static void main(String[] args) 8{ 9 Entity entityA = new Entity(); 10 entityA.id = "id1"; 11 entityA.name = "name1"; 12 13 Entity entityB = new Entity(); 14 entityB.id = "id1"; //<---同じID 15 entityB.name = "name2"; 16 17 List entityList = new ArrayList(); 18 entityList.add(entityA); 19 entityList.add(entityB); 20 21 //java8のStreamを使ってentityListの重複したID値をもつアイテムを除去したい 22 23}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

あまり綺麗ではないけど、別解?

java

1list.stream().sorted((a,b) -> Integer.compare(a.id, b.id)).filter(FilterAdapter<Integer, Entity>(-1) { 2 @Override 3 public boolean test(Entity e) { 4 boolean ret = temp != e.id; 5 temp = e.id; 6 return ret; 7 } 8}).forEach(a -> System.out.println(a)); 9

java

1public abstract class FilterAdapter<T, R> implements Predicate<R> { 2 T temp; 3 public FilterAdapter(T initial) { 4 temp = initial; 5 } 6} 7

投稿2016/01/26 03:19

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

idだけでequalsを定義していいなら

java

1public boolean equals(Object o){ 2 if(this == o) return true; 3 if(!(o instanceof Entity)) return false; 4 Entity other = (Entity)o; 5 return this.id.equals(other.id); 6}

これをEntityクラスに追加して、

java

1Entity[] newArray = entityList.stream.distinct().toArray(Entity[]::new);

これで行けるのでは?
ただし、パラレルストリームにした場合に、重複のどっちが残るかは保証できません。

投稿2016/01/23 14:57

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentaro_inoue

2016/01/25 22:13

ご回答ありがとうございます。 頂いたご回答を参考にテストを作りましたが、 NGになってしまいます。 何か根本的に私が勘違いしているのかもしれません。 コードは以下の通りです。 もしお気づきの点ありましたらご教授頂けると幸いで御座います。 何卒よろしくお願い申し上げます。 public class TestEntity { @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof TestEntity)) { return false; } TestEntity s = (TestEntity)o; return this.getID().equals(s.getID()) ; //&& this.getName().equals(s.getName()); 名前も含めるつもりです } 上記の定義を行い、以下のテストが失敗します。 @Test public void StreamTest() { TestEntity s1 = new TestEntity(null); s1.setID("A"); s1.setName("name"); TestEntity s2 = new TestEntity(null); s2.setID("A"); s2.setName("name"); Assert.assertTrue(s1.equals(s2)); //<----ここはOK TestEntity[] distincted = Arrays.asList(s1,s2).stream().distinct().toArray(TestEntity[]::new); Assert.assertEquals(1, distincted.length); //<----ここはNG }
swordone

2016/01/25 23:57

distincted.lengthの値は何ですか?
退会済みユーザー

退会済みユーザー

2016/01/26 01:57 編集

hashCode() も適切にoverrideする必要がありますね。 /// 別の例として、次のURLでは、Mapのkey管理でユニークかどうかを判断しています。 http://stackoverflow.com/a/27872852/4506703 (今回の場合ですとidをkeyにできますかね。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問