配列の要素別カウント。(C#、Java、JavaScript、PHP、Python3、Ruby比較)

 今回は配列の要素について、要素別に個数をカウントして出力する処理を扱います。

 例えば、配列 array = [“a”,”a”,”a”,”a”,”a”,”b”,”b”,”c”,”c”,”c”] であれば、

a=>5
b=>2
c=>3

と要素別に個数が出力されるようにします。

 配列の要素別カウントは、まず元の配列から重複を省いた新しい配列を作る。そして、重複を省いた配列から要素を1つづつ取り出し、その要素が元の配列内にいくつあるか個数をカウントする処理を行えばOKです。

 標準入力された文字列データ(半角スペース区切り)から配列を作り、要素別にカウントして出力する処理について、C#、Java、JavaScript、PHP、Python3、Rubyの6言語で書いてみました。

C#
using System;
using System.Linq;
using System.Collections.Generic;

public class Sample{
    public static void Main(){
        //標準入力から読み込んで配列を作る
        var line = Console.ReadLine().Trim().Split(' ');

        //重複を省いた配列を用意。
        var uniqArr = line.Distinct().ToArray();

        //元の配列について、要素別にカウントして出力
        foreach (var x in uniqArr){
            Console.WriteLine(x + "=>" + line.Count(a => a == x));
        }
    }
}

 まず、.Distinct().ToArray()メソッドで、重複が省かれた配列を作る。

 重複が省かれた配列から要素を1つづつ取り出し、.Count( a => a == x )メソッド(xは取り出した要素)を用いて元の配列に含まれる要素数をカウント。

Java
import java.util.*;

public class Main {
    //重複を省く
    public static Object[] uniqArr(String[] arr) {
        Set<String> box = new LinkedHashSet<>();

        for (var x: arr){
            box.add(x);
        }
        return box.toArray();
    }

    public static void main(String[] args) throws Exception {
        //標準入力から読み込んで配列を作る
        Scanner scan = new Scanner(System.in);
        var line = scan.nextLine().trim().split(" ");

        //要素別に個数を出力
        for (var x: uniqArr(line)){
            int count = 0;
            for (var y: line){
                if (y.equals(x)){
                    count++;
                }
            }
            System.out.println(x + "=>" + count);
        }
    }
}

 元の配列の全要素をLinkedHashSetで作ったオブジェクトに入れてから配列に変換することで、重複を省いた配列を作る。

 重複を省いた配列から要素を1つづつ取り出して、元の配列の要素数をカウント。今回は2重for文を使って一致した要素をカウントする方法しかできなかった。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

reader.on('line', (line) => {
    lines.push(line);
});

reader.on('close', () => {
    //標準入力から読み込んで配列を作る
    var arr = lines[0].trim().split(' ');

    //重複を省いた配列を作る
    var uniqArr = arr.filter(function(v,i,self){
        return self.indexOf(v) === i;
    });

    //要素別に個数をカウント
    var box = [];
    for (var val of uniqArr){
        box = arr.filter(function(x){
            return x === val;
        });
        console.log(val + "=>" + box.length);
    }
});

 最初に、

.filter(function(v,i,self){
return self.indexOf(v) === i;
});

メソッドを使って、重複を省いた配列を作る。

 重複を省いた配列から1つづつ要素を取り出し、

.filter(function(x){
return x === val;
});

メソッドで、元の配列から対象の要素だけを選び出した新しい配列を作る。そして、.lengthメソッドで新たな配列の要素数をカウントすることにより、元の配列に含まれる要素数をカウント。

PHP
<?php
//標準入力から読み込んで配列を作る
$line = trim(fgets(STDIN));
$arr = explode(' ',$line);

//要素別にカウントして、連想配列に入れる
$hashBox = array_count_values($arr);

//重複を省いた配列を作る。
$uniqArr = array_values(array_unique($arr));

//各要素を個数別に表示
foreach ($uniqArr as $x){
    echo $x."=>".$hashBox[$x]."\n";
}
?>

 最初に、array_count_values()メソッドを使って、要素をキー、その個数を値とした連想配列を作ります。

 array_unique()メソッドで、重複を省いた配列を作る。ここで、array_values()メソッドを使うと、重複を省くときに生じたインデックスの空きを詰めることができます。

 重複を省いた配列から1つづつ要素を取り出し、連想配列のキーとすることで、元の配列の要素別個数を取り出せます。

Python3
#標準入力から読み込んで配列を作る
line = input().rstrip().split(' ')

#重複を省いた配列を作る。
uniqList = sorted(list(set(line)),key = line.index)

#重複を省いた配列から要素を取り出し、元の配列について要素別にカウント
for x in uniqList:
    print(x + "=>" + str(line.count(x)))

 list(set())メソッドを使って要素の重複を省き、sorted()メソッドの第2引数にkey =>(元の配列).indexを指定して並べ替える。これによって、要素の順番を保持したまま、重複を省いた配列が得られます。

 重複を省いた配列から要素を1つづつ取り出し、.countメソッドを使うことで、元の配列の要素別にカウントできます。

Ruby
#標準入力から読み込んで配列を作る
line = gets.chomp.split(' ')

#重複を省いた配列から要素を取り出し、元の配列について要素別にカウント
line.uniq.each do |x|
    puts "#{x}=>#{line.count(x)}"
end

 .uniqメソッドで重複を省いた配列から要素を1つづつ取り出して.countメソッドを使うことで、元の配列の要素別にカウントできます。

 今回の配列の要素を要素別にカウントする処理は、文字や単語の出現回数を文字や単語別に集計することにも使えます。

にほんブログ村 ゲームブログへ

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする