配列の要素のソート(昇順・降順で並べ替える)も、頻繁に使う処理の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で出力。