' P '

whatever I will forget

Java List内のユニークな値を取り出す (HashSet, Stream.distinct())

関連記事(手動で行う場合)

mankozooyork.hatenablog.com

まあレベルBくらいであれば手動でやってもいいだろうけどまあ効率の良い方法は覚えておいて損はないので一応書いておきます。

方法1 (stream().distinct()を使う。Java8から)

distinct後の要素を使いたい場合

import java.util.stream.Collectors;が必要
array.stream().distinct().collect(Collectors.toList())という長い文を書かなくてはいけません。笑
ちなみに、下記コードはいちいちsize()をprintlnしてますが、array.stream().distinct().count()とすればarrayの個数はとれるみたいです。

ユニークな要素数だけを知りたい

下記に置き換えたらいいです。
*ただし、返却タイプがlongになるので注意。 sizeintだったらコンパイルエラーになった。

    long size = array.stream().distinct().count();
    System.out.println(size);
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Main39 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int givenNumber = scanner.nextInt();
        scanner.nextLine();
        List<Integer> array = new ArrayList<>();
        for(int i=0; i<givenNumber; i++) {
            array.add(scanner.nextInt());
        }
        List<Integer> newArray = array.stream().distinct().collect(Collectors.toList());
        System.out.println(newArray.size());
    }
}

参考

howtodoinjava.com

方法2 (Set, HashSet/TreeSetを使う)

import java.util.HashSet;
import java.util.Set;

が必要。
文法的にはこっちの方が楽かな。。
ちなみに速度はstream()よりこっちのほうが早かったです。(2倍ほど違った)
渡されるインプットが多くなる場合、こっちのほうがいいでしょう。

追記 5/23

Array型変数には使えません!
どうしてもArrayを使いたい場合は、HashSetのコンストラクタにArrays.asList(array)をぶちこみましょう。
また、上記をする場合にも、primitive型のarrayは使えません。obj型のarrayのみとなります。

stackoverflow.com

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class Main39 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int givenNumber = scanner.nextInt();
        scanner.nextLine();
        List<Integer> array = new ArrayList<>();
        for(int i=0; i<givenNumber; i++) {
            array.add(scanner.nextInt());
        }
        Set<Integer> newArray = new HashSet<Integer>(array);
        System.out.println(newArray.size());
    }
}

crunchify.com

TreeSetを使う場合

HashSetにはCollections.sort()をサクッとつかうことができません。
そのため、ユニークな値をsort(もちろんascending order)しておきたい場合は、TreeSetを使いましょう。
宣言はHashSetをTreeSetにしておくだけです。

www.geeksforgeeks.org

ちなみに

Setの中身を見るのはArrayListと同じくSystem.out.println(set)と普通にやるだけです