「Java Architecture Stack」WeChat公式アカウントをフォローし、パスワード[Java InterviewQuestions]を返信すると、大手企業からの面接質問を入手できます
問題の背景
最近、多くの友人がバックグラウンドでボー兄弟に個人的にメッセージを送り、次のような質問をしました。「ボー兄弟、私は最近仕事を探しているのですが、面接官にリストから重複を削除する方法を尋ねられました。私の答えはそうではなかったと思います」 「期待される結果ですが、Bo 兄弟は面接官を満足させるためにこの質問にどのように答えることができますか?」 この質問に対して、Bo 兄弟は重複排除に JDK 8 のストリームを使用することを提案します。なぜですか? 次にボー兄弟が行う分析をご覧ください。
リスト重複排除方法
誰もがこの質問にもっと完璧に答えられるように、Brother Bo は重複を削除する次の古典的な方法を紹介します。
2.1 イテレータの重複排除
最初の方法では、反復子を使用してデータの各項目をループすることができ、現在ループされているデータのコピーがコレクション内に 2 つ以上ある場合、現在の要素は削除されます。このループの後、重複データのないコレクションを取得できます。これは重複を削除する一般的な方法です。実装コードは次のとおりです。
public class ListTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>() {
{
add(2); add(5); add(9);
add(2); add(4); add(9);
add(3); add(7); add(8);}};
System.out.println("原list:"+list);
test(list);
}
public static void test(List<Integer> list){
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
Integer integer = iterator.next();
if(list.indexOf(integer)!=list.lastIndexOf(integer)){
iterator.remove();}
}
System.out.println("新list:"+list);
}
}
上記のコードを実行すると、次の結果が得られます。
しかし、注意して見ると、反復子を使用して重複を削除すると、List 結果の順序が混乱し、元のコレクションの順序と異なることがわかります。
2.2 ストリームの重複排除
この時点で、ボー兄弟は友人たちに新しい実施計画を紹介します。これに答えることができれば、面接官は納得してうなずいてくれると思います。この実装方法では、JDK8 によってもたらされた Stream ストリームを使用します。Stream を使用すると、次のような重複排除効果など、多くの機能を簡単に実装できます。
public class ListTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>() {
{
add(2); add(5); add(9);
add(2); add(4); add(9);
add(3); add(7); add(8);}};
System.out.println("原list:"+list);
test(list);
}
public static void test(List<Integer> list){
list=list.stream().distinct().collect(Collectors.toList());
System.out.println("新list:"+list);
}
}
上記の実装コードはイテレータ実装よりも単純であることがわかります。上記のコードを実行すると、次の結果が得られます。
さらに、stream() メソッドを使用することで、実行結果の重複排除を行うだけでなく、コレクション要素の元の順序を変更せず、コレクションのコンテンツの順序性を確保することができ、従来の重複排除方法よりも簡単かつ効果的です。パフォーマンスも向上しています。
まとめ
上記の 2 つのメソッドに加えて、実際にはリスト コレクションの重複を排除できるメソッドが他にもいくつかあります。この記事では、Bo 兄弟が上記 2 つの方法を皆さんに説明するだけなので、単なる入門書として考えてください。他の方法をご存知の場合は、コメント欄に回答してください。今日の内容は理解できましたか?Java アーキテクチャ スタックに注目すると、毎日役立つ情報が得られます。