配列の要素をソート。(C#、Java、JavaScript、PHP、Python3、Ruby比較)

 配列の要素のソート(昇順・降順で並べ替える)も、頻繁に使う処理の1つです。例えば、2分探索で検索する場合は、要素が昇順もしくは降順にソート済である必要があります。

 今回は、標準入力されたデータ(半角スペース区切りの数値)を整数型の配列(リスト)に変換し、その配列の要素を昇順・降順にソートする処理について、C#、Java、JavaScript、PHP、Python3、Rubyの6言語で書いてみました。

 C#とJavaでは、要素数が固定の「配列」と、要素数が可変で追加削除がOKな「リスト」があります。「配列」と「リスト」では、ソートの処理に使う組み込み関数が異なる場合があります。

 今回は、C#とJavaについては、「配列」と「リスト」の両方のタイプについて、要素を昇順・降順にソートする処理を行ってます。

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

public class Sample{
    //配列の全要素をカンマ区切りで出力する
    public static void arrOutput(int[] arr){
        int idx = 0;
        Console.Write("[");

        foreach (int x in arr){
            Console.Write(x);
            if (idx < arr.Length-1){
                Console.Write(", ");
            } else {
                Console.WriteLine("]");
            }
            idx += 1;
        }
    }

    //リストの全要素をカンマ区切りで出力する
    public static void listOutput(List<int> list){
        int idx = 0;
        Console.Write("[");

        foreach (int x in list){
            Console.Write(x);
            if (idx < list.Count-1){
                Console.Write(", ");
            } else {
                Console.WriteLine("]");
            }
            idx += 1;
        }
    }

    public static void Main(){
        //標準入力されたデータをint型のリストに変換。
        var line = Console.ReadLine().Trim().Split(' ');
        var list1 = new List<int>();

        foreach (var n in line){
            list1.Add(int.Parse(n));
        }

        //リストを配列に変換。
        int[] arr1 = list1.ToArray();
        int[] arr2 = arr1;

        //配列の内容を昇順で並べ替え
        Array.Sort(arr1);
        arrOutput(arr1);

        //配列の内容を降順で並べ替え
        Array.Sort(arr2);
        Array.Reverse(arr2);
        arrOutput(arr2);

        //リストの内容を昇順で並べ替え
        list1.Sort();
        listOutput(list1);

        //リストの内容を降順で並べ替え
        var list2 = list1;
        list2.Sort();
        list2.Reverse();
        listOutput(list2);
    }
}

 C#は、要素数が固定の「配列」、要素数が可変で追加削除可能な「リスト」があります。

配列の場合

 Array.Sort(配列)で、要素を昇順にソート。Array.Sort(配列)の後に続いて、Array.Reverse(配列)処理をすることで、要素を降順にソート。ソートした配列の要素は、要素の内容を出力するメソッドとして定義したarrOutput(arr)を使って出力します。

リストの場合

 リスト.Sort()で、要素を昇順にソート。リスト.Sort()の後に続いて、リスト.Reverse()処理をすることで、要素を降順にソート。ソートしたリストの要素は、要素の内容を出力するメソッドとして定義したlistOutput(list)を使って出力します。

Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        //標準入力されたデータからInteger型のリストを作る
        Scanner scan = new Scanner(System.in);
        var line = scan.nextLine().trim().split(" ");

        List<Integer> list1 = new ArrayList<>();

        for (var x: line){
            list1.add(Integer.parseInt(x));
        }

        List<Integer> list2 = list1;

        //リストを配列に変換
        Integer[] arr1 = list1.toArray(new Integer[list1.size()]);
        Integer[] arr2 = arr1;

        //配列の内容を昇順で並べ替え
        Arrays.sort(arr1);
        System.out.println(Arrays.asList(arr1));

        //配列の内容を降順で並べ替え
        Arrays.sort(arr2, Collections.reverseOrder());
        System.out.println(Arrays.asList(arr2));

        //リストの内容を昇順で並べ替え
        Collections.sort(list1);
        System.out.println(list1);

        //リストの内容を降順で並べ替え
        Collections.sort(list2,Collections.reverseOrder());
        System.out.println(list2);
    }
}

 Javaは、要素数が固定の「配列」、要素数が可変で追加削除可能な「リスト」があります。

配列の場合

 Arrays.sort(配列)で、要素を昇順にソート。Arrays.sort(配列, Collections.reverseOrder())で降順にソート。Arrays.sort()の時点で、()内の要素がソートされます。

 ソートした配列の要素は、Arrays.asList()でリストに変換してから、System.out.println()で出力します。

リストの場合

 Collections.sort(リスト)で、要素を昇順にソート。Collections.sort(リスト,Collections.reverseOrder())で、降順にソート。Collections.sort()の時点で、()内の要素がソートされます。

 ソートしたリストの要素は、System.out.println()で出力します。

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', () => {
    //標準入力されたデータをint型の配列に変換。
    var arr1 = (lines[0].trim().split(' ')).map(x => parseInt(x,10));
    var arr2 = arr1;

    //配列の内容を昇順で並べ替え
    console.log(arr1.sort((x,y) => x - y));

    //配列の内容を降順で並べ替え
    console.log(arr2.sort((x,y) => y - x));
});

 JavaScriptのsortは、()内が空欄の場合、数値型の要素を文字列に変換してソートするために、数値が正しく昇順もしくは、降順に並べ替えられないです。

 数値型の要素を正しくソートするには、sort()の()内に(x,y)=>x – yなどの比較関数を入れておく必要があります。

 配列.sort((x,y) => x – y)で、配列の要素を昇順にソート、配列.sort((x,y) => y – x)で、配列の要素を降順にソート。ソートした配列の要素は、console.logで出力。

PHP
<?php
//配列の内容をカンマ区切りで出力。
function arroutput($arr){
    $ln = count($arr);
    $idx = 0;

    foreach ($arr as $x){
        echo $x;

        if ($idx < ($ln - 1)){
            echo ",";
        } else {
            echo "\n";
        }
        $idx += 1;
    }
}

//標準入力されたデータをint型の配列に変換。
$line = trim(fgets(STDIN));
$arr1 = explode(' ',$line);
$arr2 = $arr1;

//配列の中身を昇順で並べ替える
sort($arr1);
arroutput($arr1);

//配列の中身を降順で並べ替える
rsort($arr2);
arroutput($arr2);
?>

 sort(配列)で、要素を昇順にソート。rsort(配列)で、降順にソート。sort()、rsort()の時点で、()内の配列がソートされます。ソートした配列の要素は、要素の内容を出力するメソッドとして定義した$arroutput($arr)を使って出力します。

Python3
#標準入力されたデータをint型の配列に変換。
arr1 = list(map(int,input().rstrip().split(' ')))
arr2 = arr1

#リストの内容を昇順に並べ替え
print(sorted(arr1))

#リストの内容を降順に並べ替え
print(sorted(arr2, reverse=True))

 sorted(リスト)で、要素を昇順にソート。sorted(リスト, reverse=True)で要素を降順にソート。要素をソートしたリストの内容は、print()で出力。

Ruby
#標準入力されたデータをint型の配列に変換。
arr1 = gets.chomp.split(' ').map(&:to_i)
arr2 = arr1

#配列の内容を昇順で並べ替え
p arr1.sort

#配列の内容を降順で並べ替え
p arr2.sort.reverse

 配列.sortで、要素を昇順にソート。配列.sort.reverseで、要素を降順にソート。要素をソートした配列の内容は、pで出力。

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

スポンサーリンク

シェアする

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

フォローする