関連記事(手動で行う場合)
まあレベル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
になるので注意。 size
がint
だったらコンパイルエラーになった。
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()); } }
参考
方法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のみとなります。
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()); } }
TreeSetを使う場合
HashSetにはCollections.sort()
をサクッとつかうことができません。
そのため、ユニークな値をsort(もちろんascending order)しておきたい場合は、TreeSetを使いましょう。
宣言はHashSetをTreeSetにしておくだけです。
ちなみに
Setの中身を見るのはArrayListと同じくSystem.out.println(set)
と普通にやるだけです