例えばi=1の時のループでj=3の時にifを満たし配列の数値をインクリメントします。この時点で本来ならb[3]
にある「青」は用済みなのですが、そのまま残っているためi=3のループで再度カウントされてしまいます。
###単純に考えると
先述の通り、一度探したものはもう用済みなので、配列から消してしまうのが簡単でしょうか。
この場合、一致検索する際に「消えているかどうか」の判定も必要になります。
java
1public class Main {
2 public static void main(String[] args) {
3
4
5 Scanner sc = new Scanner(System.in);
6 String a = "赤 青 黄色 青 黄色 黄色";
7 String[] b = a.split("[ ]");
8 int n[] = new int[b.length];
9
10
11 for(int i = 0; i < b.length; i++) {
12 if (b[i] == null) continue;
13 n[i] = 1;
14 for(int j = i + 1; j < b.length; j++) {
15 if(b[i].equals(b[j])) {
16 n[i] = n[i] + 1;
17 b[j] = null;
18 }
19 }
20 }
21
22 for(int i = 0; i < b.length; i++) {
23 if (b[i] == null) continue;
24 System.out.println(b[i] + " " + n[i]);
25 }
26 }
27}
###Mapを使って単純化
Mapを使えば、同じもののカウントを簡単にできます。
java
1public class Main {
2 public static void main(String[] args) {
3
4
5 Scanner sc = new Scanner(System.in);
6 String a = "赤 青 黄色 青 黄色 黄色";
7 String[] b = a.split("[ ]");
8 Map<String, Integer> map = new HashMap<>();
9
10 for(int i = 0; i < b.length; i++) {
11 map.merge(b[i], 1, Integer::sum);
12 }
13
14 map.forEach((k, v) -> System.out.println(k + " " + v));
15 }
16}
###Streamを使ってさらに短く
java
1public class Main {
2 public static void main(String[] args) {
3
4 String a = "赤 青 黄色 青 黄色 黄色";
5 String[] b = a.split("[ ]");
6 Arrays.stream(b).collect(Collectors.groupingBy(s -> s, Collectors.counting()))
7 .forEach((k, v) -> System.out.println(k + " " + v));
8 }
9}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。