プログラミング言語の比較 > リスト(または配列)

2つのリストを結合した新しいリストを作る

Java

Java 8以降
  1. // import java.util.stream.IntStream;
  2. IntStream stream1 = IntStream.of(123);
  3. IntStream stream2 = IntStream.of(214);
  4. IntStream result = IntStream.concat(stream1, stream2);
  1. // import java.util.stream.IntStream;
  2. // import java.util.stream.Stream;
  3. IntStream stream1 = IntStream.of(123);
  4. IntStream stream2 = IntStream.of(214);
  5. IntStream result = Stream.of(stream1, stream2).flatMapToInt(s -> s);
Java 7まで
  1. List<Integer> list1 = Arrays.asList(123);
  2. List<Integer> list2 = Arrays.asList(214);
  3. List<Integer> result = new ArrayList<Integer>();
  4. result.addAll(list1);
  5. result.addAll(list2);
Commons Collections 4.0以降を使った場合
  1. // import org.apache.commons.collections4.ListUtils;
  2. List<Integer> list1 = Arrays.asList(123);
  3. List<Integer> list2 = Arrays.asList(214);
  4. List<Integer> result = ListUtils.union(list1, list2);
Guava を使った場合
  1. // import com.google.common.collect.*;
  2. // import com.google.common.primitives.Ints;
  3. List<Integer> list1 = Ints.asList(123);
  4. List<Integer> list2 = Ints.asList(214);
  5. List<Integer> result = Lists.newArrayList(Iterables.concat(list1, list2));

Groovy

  1. def list1 = [123]
  2. def list2 = [214]
  3. def result = list1 + list2

Scala

  1. val list1 = List(123)
  2. val list2 = List(214)
  3. val result = list1 ::: list2

Erlang

  1. List1 = [123],
  2. List2 = [214],
  3. Result = List1 ++ List2.

Haskell

  1. let list1 = [123]
  2. let list2 = [214]
  3. let result = list1 ++ list2

PowerShell

  1. $array1 = 123
  2. $array2 = 214
  3. $result = $array1 + $array2

F#

  1. let list1 = [123]
  2. let list2 = [214]
  3. let result = list1 @ list2

C#

C# 3.0以降
  1. int[] array1 = { 123 };
  2. int[] array2 = { 214 };
  3. var result = array1.Concat(array2);             // result の型は IEnumerable<int>
C# 2.0
  1. int[] array1 = { 123 };
  2. int[] array2 = { 214 };
  3. List<int> result = new List<int>(array1);
  4. result.AddRange(array2);

C++

  1. #include <vector>
  2. int array1[] = {123};
  3. int array2[] = {214};
  4. vector<int> result;
  5. result.insert(result.end(), array1, array1 + 3);
  6. result.insert(result.end(), array2, array2 + 3);

Go

  1. // import "container/list"
  2. array1 := [...]int{123}
  3. array2 := [...]int{214}
  4. result := list.New()
  5. for _, x := range(array1) {
  6.     result.PushBack(x)
  7. }
  8. for _, x := range(array2) {
  9.     result.PushBack(x)
  10. }

Dart

  1. List<int> list1 = [123];
  2. List<int> list2 = [214];
  3. List<int> result = new List.from(list1);
  4. result.addAll(list2);

ActionScript

  1. var array1:Array = [123];
  2. var array2:Array = [214];
  3. var result:Array = array1.concat(array2);

JavaScript

  1. var array1 = [123];
  2. var array2 = [214];
  3. var result = array1.concat(array2);

CoffeeScript

  1. array1 = [123]
  2. array2 = [214]
  3. result = array1.concat array2

Lua

  1. t1 = { 123 }
  2. t2 = { 214 }
  3. result = {}
  4. for _, x in ipairs(t1) do table.insert(result, x) end
  5. for _, x in ipairs(t2) do table.insert(result, x) end

Ruby

  1. array1 = [123]
  2. array2 = [214]
  3. result = array1 + array2

Python

  1. list1 = [123]
  2. list2 = [214]
  3. result = list1 + list2

PHP

  1. $array1 = array(123);
  2. $array2 = array(214);
  3. $result = array_merge($array1$array2);

Perl

  1. my @array1 = (123);
  2. my @array2 = (214);
  3. my @result = (@array1@array2);

リスト内の文字列を短い順に出力する(元のリストを変更しない)

Java

Java 8以降

安定ソート
  1. // import java.util.stream.Stream;
  2. Stream<String> stream = Stream.of("March""April""May""June""July");
  3. Stream<String> newStream = stream.sorted(Comparator.comparing(s -> s.length()));
  4. newStream.forEach(System.out::println);
Guava を使った場合
安定ソート
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural().onResultOf(input -> input.length());
  5. List<String> result = ordering.sortedCopy(list);
  6. result.forEach(System.out::println);

Java 7まで

安定ソート
  1. String[] array = {"March""April""May""June""July"};
  2. String[] newArray = Arrays.copyOf(array, array.length);             // 配列をコピーする
  3. Arrays.sort(newArray, new Comparator<String>() {
  4.     @Override
  5.     public int compare(String o1, String o2) {
  6.         return o1.length() - o2.length();
  7.     }
  8. });
  9. for (String s : newArray) {
  10.     System.out.println(s);
  11. }
Commons Collections 4.0以降を使った場合
安定ソート
  1. // import org.apache.commons.collections4.*;
  2. String[] array = {"March""April""May""June""July"};
  3. String[] newArray = Arrays.copyOf(array, array.length);             // 配列をコピーする
  4. Arrays.sort(newArray, ComparatorUtils.transformedComparator(
  5.         ComparatorUtils.naturalComparator(),
  6.         new Transformer<String, Integer>() {
  7.             @Override
  8.             public Integer transform(String input) {
  9.                 return input.length();
  10.             }
  11.         }));
  12. for (String s : newArray) {
  13.     System.out.println(s);
  14. }
Guava を使った場合
安定ソート
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural().onResultOf(new Function<String, Integer>() {
  5.     @Override
  6.     public Integer apply(String input) {
  7.         return input.length();
  8.     }
  9. });
  10. List<String> result = ordering.sortedCopy(list);
  11. for (String s : result) {
  12.     System.out.println(s);
  13. }

Groovy

  1. def list = ['March''April''May''June''July']
  2. def newList = list.clone()                                  // リストをコピーする
  3. newList.sort { it.length() }.each { println it }

Scala

安定でないソート
  1. val list = List("March""April""May""June""July")
  2. list.sortBy(_.length).foreach(println)
安定ソート
  1. // import scala.util.Sorting
  2. val list = List("March""April""May""June""July")
  3. Sorting.stableSort(list, (_: String).length).foreach(println)
  1. val list = List("March""April""May""June""July")
  2. list.sortWith(_.length < _.length).foreach(println)

Erlang

安定でないソート
  1. List = ["March""April""May""June""July"],
  2. Sorted = lists:sort(fun(X, Y) -> length(X) =< length(Y) end, List),
  3. lists:foreach(fun(S) -> io:format("~s~n", [S]) end, Sorted).

Haskell

安定ソート
  1. -- import List
  2. let list = ["March""April""May""June""July"]
  3. let result = sortBy (\ x y -> compare (length x) (length y)) list
  4. mapM_ putStrLn result

PowerShell

  1. $array = 'March''April''May''June''July'
  2. $array | sort Length

F#

  1. let list = ["March""April""May""June""July"]
  2. list |> List.sortBy String.length |> List.iter (printfn "%s")
  1. let list = ["March""April""May""June""July"]
  2. for s in List.sortBy String.length list do printfn "%s" s
F# 3.0以降
  1. let list = ["March""April""May""June""July"]
  2. Seq.iter ignore <| query { for s in list do
  3.                            sortBy s.Length
  4.                            select (printfn "%s" s) }

C#

C# 3.0以降
安定ソート
  1. string[] array = { "March""April""May""June""July" };
  2. foreach (string s in array.OrderBy(s => s.Length)) {
  3.     Console.WriteLine(s);
  4. }
  1. string[] array = { "March""April""May""June""July" };
  2. var query = from s in array orderby s.Length select s;                  // query の型は IOrderedEnumerable<string>
  3. foreach (string s in query) {
  4.     Console.WriteLine(s);
  5. }
C# 2.0
安定でないソート
  1. string[] array = { "March""April""May""June""July" };
  2. string[] newArray = (string[])array.Clone();                            // 配列をコピーする
  3. Array.Sort(newArray, delegate (string x, string y) { return x.Length - y.Length; });
  4. foreach (string s in newArray) {
  5.     Console.WriteLine(s);
  6. }
  1. string[] array = { "March""April""May""June""July" };
  2. string[] newArray = (string[])array.Clone();                            // 配列をコピーする
  3. int[] lengthArray = Array.ConvertAll(newArray, delegate (string s) { return s.Length; });
  4. Array.Sort(lengthArray, newArray);                                      // lengthArray を使って newArray をソートする
  5. foreach (string s in newArray) {
  6.     Console.WriteLine(s);
  7. }

C++

  1. bool length_ascending(const string& x, const string& y) {
  2.     return x.length() < y.length();
  3. }
安定でないソート
  1. #include <algorithm>
  2. #include <vector>
  3. const int N = 5;
  4. string array[N] = {"March""April""May""June""July"};
  5. vector<string> v(array, array + N);
  6. sort(v.begin(), v.end(), length_ascending);
  7. for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {
  8.     cout << *it << endl;
  9. }
安定ソート
  1. #include <algorithm>
  2. #include <vector>
  3. const int N = 5;
  4. string array[N] = {"March""April""May""June""July"};
  5. vector<string> v(array, array + N);
  6. stable_sort(v.begin(), v.end(), length_ascending);
  7. for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {
  8.     cout << *it << endl;
  9. }

Go

専用の型を用意する
  1. // インターフェース sort.Interface を実装する
  2. type LengthAscending []string
  3. func (this LengthAscending) Len() int {
  4.     return len(this)
  5. }
  6. func (this LengthAscending) Less(i, j intbool {
  7.     return len(this[i]) < len(this[j])
  8. }
  9. func (this LengthAscending) Swap(i, j int) {
  10.     this[i], this[j] = this[j], this[i]
  11. }
  1. // import "sort"
  2. array := [...]string{"March""April""May""June""July"}
  3. newArray := array                                                   // 配列をコピーする
  4. sort.Sort(LengthAscending(newArray[:]))
  5. for _, s := range newArray {
  6.     fmt.Printf("%s\n", s)
  7. }
汎用的な型を用意する
  1. // インターフェース sort.Interface を実装する
  2. type StringSort struct {
  3.     array []string
  4.     less func(a, b *stringbool                                    // 関数型のフィールド
  5. }
  6. func (this *StringSort) Len() int {
  7.     return len(this.array)
  8. }
  9. func (this *StringSort) Less(i, j intbool {
  10.     return this.less(&this.array[i], &this.array[j])
  11. }
  12. func (this *StringSort) Swap(i, j int) {
  13.     this.array[i], this.array[j] = this.array[j], this.array[i]
  14. }
  1. // import "sort"
  2. array := [...]string{"March""April""May""June""July"}
  3. newArray := array                                                   // 配列をコピーする
  4. sort.Sort(&StringSort{newArray[:], func(a, b *stringbool {
  5.     return len(*a) < len(*b)
  6. }})
  7. for _, s := range newArray {
  8.     fmt.Printf("%s\n", s)
  9. }

Dart

  1. List<String> list = ['March''April''May''June''July'];
  2. List<String> newList = new List.from(list);                         // リストをコピーする
  3. newList.sort((a, b) => a.length - b.length);
  4. newList.forEach(print);

ActionScript

安定でないソート
  1. var array:Array = ['March''April''May''June''July'];
  2. var newArray:Array = array.slice();                                 // 配列をコピーする
  3. newArray.sort(function(x:String, y:String):int { return x.length - y.length; });
  4. for each (var s:String in newArray) {
  5.     trace(s);
  6. }
  1. var array:Array = ['March''April''May''June''July'];
  2. var proxyArray:Array = array.map(
  3.     function(item:String, index:int, array:Array):ObjectProxy { return new ObjectProxy(item); });
  4. proxyArray.sortOn('length', Array.NUMERIC);
  5. for each (var s:String in proxyArray) {
  6.     trace(s);
  7. }

JavaScript

Firefox 3.0以降では安定ソート、その他は実装に依る
  1. var array = ['March''April''May''June''July'];
  2. var newArray = array.slice(0);                                      // 配列をコピーする
  3. newArray.sort(function(x, y) { return x.length - y.length; });
  4. for (var i in newArray) {
  5.     alert(newArray[i]);
  6. }
JavaScript 1.8(Firefox 3.0)以降
  1. var array = ['March''April''May''June''July'];
  2. var newArray = array.slice(0);                                      // 配列をコピーする
  3. newArray.sort(function(x, y) x.length - y.length);
  4. newArray.forEach(alert);
  1. var array = ['March''April''May''June''July'];
  2. var newArray = array.slice(0);                                      // 配列をコピーする
  3. newArray.sort(function(x, y) x.length - y.length);
  4. for (let[, s] in newArray) {
  5.     alert(s);
  6. }
prototype.js を使った場合
  1. var array = ['March''April''May''June''July'];
  2. array.sortBy(function (s, i) { return s.length; }).each(function (s, i) { alert(s); });
MochiKit を使った場合
  1. var array = ['March''April''May''June''July'];
  2. var newArray = array.slice(0);                                      // 配列をコピーする
  3. newArray.sort(keyComparator('length'));
  4. forEach(array, alert);

CoffeeScript

Firefox 3.0以降では安定ソート、その他は実装に依る
  1. array = ['March''April''May''June''July']
  2. newArray = array.slice 0
  3. newArray.sort (x, y) -> x.length - y.length
  4. alert s for s in newArray
prototype.js を使った場合
  1. array = ['March''April''May''June''July']
  2. array.sortBy((s, i) -> s.length).each((s, i) -> alert(s))
MochiKit を使った場合
  1. array = ['March''April''May''June''July']
  2. newArray = array.slice 0                                            # 配列をコピーする
  3. newArray.sort (keyComparator 'length')
  4. forEach newArray, alert

Lua

安定でないソート
  1. t = { 'March''April''May''June''July' }
  2. t2 = { unpack(t) }                                                  -- テーブル(配列)をコピーする
  3. table.sort(t2, function(a, b) return a:len() < b:len() end)
  4. for _, s in ipairs(t2) do
  5.     print(s)
  6. end

Ruby

安定でないソート
  1. array = %w[March April May June July]
  2. puts array.sort_by {|s| s.length }

Python

安定ソート
  1. l = ['March''April''May''June''July']
  2. for s in sorted(l, key = len):
  3.     print(s)

PHP

安定でないソート
PHP 5.3.0以降
  1. $array = array('March''April''May''June''July');
  2. $newArray = $array;                                             // 配列をコピーする
  3. usort($newArrayfunction($a$b) { return strlen($a) - strlen($b); });
  4. foreach ($newArray as $s) {
  5.     echo $s"\n";
  6. }
PHP 5.2.xまで
  1. $array = array('March''April''May''June''July');
  2. $newArray = $array;                                             // 配列をコピーする
  3. usort($newArray, create_function('$a, $b''return strlen($a) - strlen($b);'));
  4. foreach ($newArray as $s) {
  5.     echo $s"\n";
  6. }

Perl

Perl 5.6までは安定でないソート、Perl 5.7以降は安定ソート
  1. my @array = qw/March April May June July/;
  2. for (sort { length($a) <=> length($b) } @array) {
  3.     print "$_\n";
  4. }
  1. my @array = qw/March April May June July/;
  2. print "$_\n" for sort { length($a) <=> length($b) } @array;
  1. my @array = qw/March April May June July/;
  2. print "$_\n" for                                # ここは、下から順に読む
  3.     map $_->[0],                                # 3. 各ペアの前側だけ残す
  4.     sort { $a->[1] <=> $b->[1] }                # 2. ペアの後ろ側(長さ)でソートする
  5.     map [$_, length], @array;                   # 1. 文字列とその長さのペアの配列にする

リスト内の文字列を短い順・辞書順に出力する(元のリストを変更して良い)

Java

Java 8以降

  1. // import java.util.stream.Stream;
  2. Stream<String> stream = Stream.of("March""April""May""June""July");
  3. Stream<String> newStream = stream.sorted(
  4.     Comparator.comparing((String s) -> s.length()).thenComparing(s -> s));
  5. newStream.forEach(System.out::println);
Guava を使った場合
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural()
  5.     .onResultOf((String input) -> input.length()).compound(Ordering.natural());
  6. List<String> result = ordering.sortedCopy(list);
  7. result.forEach(System.out::println);

Java 7まで

  1. String[] array = {"March""April""May""June""July"};
  2. Arrays.sort(array, new Comparator<String>() {
  3.     @Override
  4.     public int compare(String o1, String o2) {
  5.         int result = o1.length() - o2.length();
  6.         return result == 0 ? o1.compareTo(o2) : result;
  7.     }
  8. });
  9. for (String s : array) {
  10.     System.out.println(s);
  11. }
Guava を使った場合
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural().onResultOf(new Function<String, Integer>() {
  5.     @Override
  6.     public Integer apply(String input) {
  7.         return input.length();
  8.     }
  9. }).compound(Ordering.natural());
  10. List<String> result = ordering.sortedCopy(list);
  11. for (String s : result) {
  12.     System.out.println(s);
  13. }

Groovy

  1. def list = ['March''April''May''June''July']
  2. list.sort { x, y ->
  3.     x.length() <=> y.length() ?: x <=> y
  4. }.each { println it }

Scala

安定でないソート
  1. val list = List("March""April""May""June""July")
  2. list.sortBy(s => (s.length, s)).foreach(println)
安定ソート
  1. // import scala.util.Sorting
  2. val list = List("March""April""May""June""July")
  3. Sorting.stableSort(list, (s: String) => (s.length, s)).foreach(println)

Erlang

  1. List = ["March""April""May""June""July"],
  2. F = fun(X, Y) ->
  3.         LenX = length(X),
  4.         LenY = length(Y),
  5.         LenX < LenY orelse LenX =:= LenY andalso X =< Y
  6.     end,
  7. Sorted = lists:sort(F, List),
  8. lists:foreach(fun(S) -> io:format("~s~n", [S]) end, Sorted).

Haskell

安定ソート
  1. -- import List
  2. let list = ["March""April""May""June""July"]
  3. let result = sortBy (\ x y -> compare (length x, x) (length y, y)) list
  4. mapM_ putStrLn result

PowerShell

  1. $array = 'March''April''May''June''July'
  2. $array | sort Length, { $_ }

F#

  1. let list = ["March""April""May""June""July"]
  2. list |> List.sortBy (fun s -> (s.Length, s)) |> List.iter (printfn "%s")
  1. let list = ["March""April""May""June""July"]
  2. for s in list |> List.sortBy (fun s -> (s.Length, s)) do printfn "%s" s
F# 3.0以降
  1. let list = ["March""April""May""June""July"]
  2. Seq.iter ignore <| query { for s in list do
  3.                            sortBy s.Length
  4.                            thenBy s
  5.                            select (printfn "%s" s) }

C#

C# 3.0以降
安定ソート
  1. string[] array = { "March""April""May""June""July" };
  2. var query = from s in array orderby s.Length, s select s;                   // query の型は IEnumerable<string>
  3. foreach (var s in query) {
  4.     Console.WriteLine(s);
  5. }
  1. string[] array = { "March""April""May""June""July" };
  2. foreach (var s in array.OrderBy(s => s.Length).ThenBy(s => s)) {
  3.     Console.WriteLine(s);
  4. }
C# 2.0
安定でないソート
  1. string[] array = { "March""April""May""June""July" };
  2. Array.Sort(array, delegate (string x, string y) {
  3.     int result = x.Length - y.Length;
  4.     return result == 0 ? string.Compare(x, y) : result;
  5. });
  6. foreach (string s in array) {
  7.     Console.WriteLine(s);
  8. }

C++

  1. bool length_value_ascending(const string& x, const string& y) {
  2.     int result = x.length() - y.length();
  3.     return result == 0 ? x < y : result < 0;
  4. }
安定でないソート
  1. #include <algorithm>
  2. const int N = 5;
  3. string array[N] = {"March""April""May""June""July"};
  4. sort(array, array + N, length_value_ascending);
  5. for (int i = 0; i < N; i++) {
  6.     cout << array[i] << endl;
  7. }
安定ソート
  1. #include <algorithm>
  2. const int N = 5;
  3. string array[N] = {"March""April""May""June""July"};
  4. stable_sort(array, array + N, length_value_ascending);
  5. for (int i = 0; i < N; i++) {
  6.     cout << array[i] << endl;
  7. }

Go

専用の型を用意する
  1. // インターフェース sort.Interface を実装する
  2. type LengthValueAscending []string
  3. func (this LengthValueAscending) Len() int {
  4.     return len(this)
  5. }
  6. func (this LengthValueAscending) Less(i, j intbool {
  7.     result := len(this[i]) - len(this[j])
  8.     if result == 0 {
  9.         return this[i] < this[j]
  10.     }
  11.     return result < 0
  12. }
  13. func (this LengthValueAscending) Swap(i, j int) {
  14.     this[i], this[j] = this[j], this[i]
  15. }
  1. // import "sort"
  2. array := [...]string{"March""April""May""June""July"}
  3. sort.Sort(LengthValueAscending(array[:]))
  4. for _, s := range array {
  5.     fmt.Printf("%s\n", s)
  6. }
汎用的な型を用意する
  1. // インターフェース sort.Interface を実装する
  2. type StringSort struct {
  3.     array []string
  4.     less func(a, b *stringbool                // 関数型のフィールド
  5. }
  6. func (this *StringSort) Len() int {
  7.     return len(this.array)
  8. }
  9. func (this *StringSort) Less(i, j intbool {
  10.     return this.less(&this.array[i], &this.array[j])
  11. }
  12. func (this *StringSort) Swap(i, j int) {
  13.     this.array[i], this.array[j] = this.array[j], this.array[i]
  14. }
  1. // import "sort"
  2. array := [...]string{"March""April""May""June""July"}
  3. sort.Sort(&StringSort{array[:], func(a, b *stringbool {
  4.     result := len(*a) - len(*b)
  5.     if result == 0 {
  6.         return *a < *b
  7.     }
  8.     return result < 0
  9. }})
  10. for _, s := range array {
  11.     fmt.Printf("%s\n", s)
  12. }

Dart

  1. List<String> list = ['March''April''May''June''July'];
  2. list.sort((a, b) {
  3.     int result = a.length - b.length;
  4.     if (result == 0) {
  5.         result = a.compareTo(b);
  6.     }
  7.     return result;
  8. });
  9. list.forEach(print);

ActionScript

安定でないソート
  1. var array:Array = ['March''April''May''June''July'];
  2. array.sort(function(x:String, y:String):int {
  3.     var result:int = x.length - y.length;
  4.     return result === 0 ? ObjectUtils.stringCompare(x, y) : result;
  5. });
  6. for each (var s:String in array) {
  7.     trace(s);
  8. }
  1. // import mx.collections.*;
  2. var array:Array = ['March''April''May''June''July'];
  3. var proxyArray:Array = array.map(
  4.     function(item:String, index:int, array:Array):ObjectProxy { return new ObjectProxy(item); });
  5. var sort:Sort = new Sort();
  6. sort.fields = [new SortField('length'falsefalsetrue), new SortField()];
  7. sort.sort(proxyArray);
  8. for each (var s:String in proxyArray) {
  9.     trace(s);
  10. }

JavaScript

Firefox 3.0以降では安定ソート、その他は実装に依る
  1. var array = ['March''April''May''June''July'];
  2. array.sort(function(x, y) {
  3.     var result = x.length - y.length;
  4.     if (result == 0) {
  5.         result = x < y ? -1 : x > y ? 1 : 0;
  6.     }
  7.     return result;
  8. });
  9. for (var i in array) {
  10.     alert(array[i]);
  11. }
prototype.js を使った場合
  1. var array = ['March''April''May''June''July'];
  2. array.sortBy(function (s, i) { return [s.length, s]; }).each(function (s, i) { alert(s); });

CoffeeScript

Firefox 3.0以降では安定ソート、その他は実装に依る
  1. array = ['March''April''May''June''July']
  2. array.sort (x, y) ->
  3.     result = x.length - y.length
  4.     result = (if x < y then -1 else
  5.               if x > y then  1 else 0if result == 0
  6.     result
  7. alert s for s in array
prototype.js を使った場合
  1. array = ['March''April''May''June''July']
  2. array.sortBy((s, i) -> [s.length, s]).each((s, i) -> alert(s))

Lua

安定でないソート
  1. t = { 'March''April''May''June''July' }
  2. table.sort(t,
  3.     function(a, b)
  4.         if a:len() == b:len() then
  5.             return a < b
  6.         else
  7.             return a:len() < b:len()
  8.         end
  9.     end)
  10. for _, s in ipairs(t) do
  11.     print(s)
  12. end

Ruby

安定でないソート
  1. array = %w[March April May June July]
  2. puts array.sort_by {|s| [s.length, s] }

Python

安定ソート
  1. l = ['March''April''May''June''July']
  2. l.sort(key = lambda s: [len(s), s])
  3. for s in l:
  4.     print(s)

PHP

安定でないソート
PHP 5.3.0以降
  1. $array = array('March''April''May''June''July');
  2. usort($arrayfunction($a$b) {
  3.     $result = strlen($a) - strlen($b);
  4.     return $result === 0 ? strcmp($a$b) : $result;
  5. });
  6. foreach ($array as $s) {
  7.     echo $s"\n";
  8. }
PHP 5.2.x まで
  1. $array = array('March''April''May''June''July');
  2. usort($array, create_function('$a, $b', <<<'END'
  3.     $result = strlen($a) - strlen($b);
  4.     return $result === 0 ? strcmp($a, $b) : $result;
  5. END
  6. ));
  7. foreach ($array as $s) {
  8.     echo $s"\n";
  9. }

Perl

Perl 5.6までは安定でないソート、Perl 5.7以降は安定ソート
  1. my @array = qw/March April May June July/;
  2. for (sort { length($a) <=> length($bor $a cmp $b } @array) {
  3.     print "$_\n";
  4. }
  1. my @array = qw/March April May June July/;
  2. print "$_\n" for sort { length($a) <=> length($bor $a cmp $b } @array;
  1. my @array = qw/March April May June July/;
  2. print "$_\n" for                                                # ここは下から順に読む
  3.     map $_->[0],                                                # 3. 各ペアの前側だけ残す
  4.     sort { $a->[1] <=> $b->[1or $a->[0cmp $b->[0] }         # 2. 短い順、文字列の昇順にソートする
  5.     map [$_, length], @array;                                   # 1. 文字列とその長さのペアの配列にする

リストから最も長い文字列を1つだけ取り出す

Java

Java 8以降

  1. // import java.util.stream.Stream;
  2. Stream<String> stream = Stream.of("March""April""May""June""July");
  3. String result = stream.max(Comparator.comparing(s -> s.length())).get();
  1. List<String> list = Arrays.asList("March""April""May""June""July");
  2. String result = Collections.max(list, Comparator.comparing(s -> s.length()));
Guava を使った場合
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural().onResultOf(input -> input.length());
  5. String result = ordering.max(list);

Java 7まで

  1. List<String> list = Arrays.asList("March""April""May""June""July");
  2. String result = Collections.max(list, new Comparator<String>() {
  3.     @Override
  4.     public int compare(String o1, String o2) {
  5.         return o1.length() - o2.length();
  6.     }
  7. });
Commons Collections 4.0以降を使った場合
  1. // import org.apache.commons.collections4.*;
  2. List<String> list = Arrays.asList("March""April""May""June""July");
  3. String result = Collections.max(list, ComparatorUtils.transformedComparator(
  4.         ComparatorUtils.naturalComparator(),
  5.         new Transformer<String, Integer>() {
  6.             @Override
  7.             public Integer transform(String input) {
  8.                 return input.length();
  9.             }
  10.         }));
Guava を使った場合
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.Ordering;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Ordering<String> ordering = Ordering.natural().onResultOf(new Function<String, Integer>() {
  5.     @Override
  6.     public Integer apply(String input) {
  7.         return input.length();
  8.     }
  9. });
  10. String result = ordering.max(list);

Groovy

  1. def list = ['March''April''May''June''July']
  2. def result = list.max { it.length() }

Scala

  1. val list = List("March""April""May""June""July")
  2. val result = list.max(Ordering.by((_: String).length))
  1. val list = List("March""April""May""June""July")
  2. val result = list.reduceLeft((x, y) => if (x.length > y.length) x else y)
  1. val list = List("March""April""May""June""July")
  2. val result = list.sortBy(_.length).last

Erlang

  1. List = ["March""April""May""June""July"],
  2. [Result|_] = lists:sort(fun(X, Y) -> length(X) > length(Y) end, List).
  1. List = ["March""April""May""June""July"],
  2. Longer = fun(X, Y) ->                                   %% 2つの文字列のうち長い方を選ぶ関数
  3.              if
  4.                  length(X) > length(Y) -> X;
  5.                  true                  -> Y
  6.              end
  7.          end,
  8. Result = lists:foldl(Longer, "", List).

Haskell

  1. -- import List
  2. let list = ["March""April""May""June""July"]
  3. let result = maximumBy (\ x y -> compare (length x) (length y)) list

PowerShell

  1. $array = 'March''April''May''June''July'
  2. $result = ($array | sort Length -Descending)[0]

F#

  1. let list = ["March""April""May""June""July"]
  2. let result = List.maxBy String.length list
  1. let list = ["March""April""May""June""July"]
  2. let result = list |> List.maxBy String.length
F# 3.0以降
  1. let list = ["March""April""May""June""July"]
  2. let result = query { for s in list do
  3.                      sortByDescending s.Length
  4.                      head }

C#

C# 3.0以降
  1. string[] array = { "March""April""May""June""July" };
  2. var result = array.Aggregate((x, y) => x.Length > y.Length ? x : y);
  1. string[] array = { "March""April""May""June""July" };
  2. var result = (from s in array orderby s.Length descending select s).First();
  1. string[] array = { "March""April""May""June""July" };
  2. var result = array.OrderByDescending(s => s.Length).First();
  1. string[] array = { "March""April""May""June""July" };
  2. var maxLength = array.Max(s => s.Length);
  3. var result = array.First(s => s.Length == maxLength);

C++

  1. bool length_ascending(const string& x, const string& y) {
  2.     return x.length() < y.length();
  3. }
  1. #include <algorithm>
  2. const int N = 5;
  3. string array[N] = {"March""April""May""June""July"};
  4. string* result = max_element(array, array + N, length_ascending);

Go

  1. array := [...]string{"March""April""May""June""July"}
  2. var result string
  3. maxLength := -1
  4. for _, s := range(array) {
  5.     if len(s) > maxLength {
  6.         maxLength = len(s)
  7.         result = s
  8.     }
  9. }

Dart

  1. List<String> list = ['March''April''May''June''July'];
  2. list.sort((a, b) => b.length - a.length);
  3. String result = list[0];

ActionScript

  1. var array:Array = ['March''April''May''June''July'];
  2. array.sort(function(x:String, y:String):int { return y.length - x.length; });
  3. var result:String = array[0];

JavaScript

  1. var array = ['March''April''May''June''July'];
  2. array.sort(function(x, y) { return x.length - y.length; });             // 短い順に並べる
  3. var result = array.pop();                                               // 最後の要素を取り出す
prototype.js を使った場合
  1. var array = ['March''April''May''June''July'];
  2. var maxLength = array.max(function (s, i) { return s.length; });
  3. var result = array.find(function (s, i) { return s.length == maxLength; });
  1. var array = ['March''April''May''June''July'];
  2. var maxLength = array.pluck('length').max();
  3. var result = array.detect(function (s, i) { return s.length == maxLength; });
MochiKit を使った場合
  1. var array = ['March''April''May''June''July'];
  2. array.sort(keyComparator('length'));
  3. var result = array.pop();

CoffeeScript

  1. array = ['March''April''May''June''July']
  2. array.sort (x, y) -> x.length - y.length                    # 短い順に並べる
  3. result = array.pop()                                        # 最後の要素を取り出す
prototype.js を使った場合
  1. array = ['March''April''May''June''July']
  2. maxLength = array.max (s, i) -> s.length
  3. result = array.find (s, i) -> s.length == maxLength
  1. array = ['March''April''May''June''July']
  2. maxLength = array.pluck('length').max()
  3. result = array.detect (s, i) -> s.length == maxLength
MochiKit を使った場合
  1. array = ['March''April''May''June''July']
  2. array.sort (keyComparator 'length')
  3. result = array.pop()

Lua

  1. t = { 'March''April''May''June''July' }
  2. table.sort(t, function(a, b) return a:len() > b:len() end)
  3. result = t[1]                                                   -- 1はテーブル(配列)の先頭の添字

Ruby

Ruby 1.8まで
  1. array = %w[March April May June July]
  2. result = array.sort_by {|s| s.size }.last
Ruby 1.9以降
  1. array = %w[March April May June July]
  2. result = array.max_by {|s| s.size }

Python

  1. l = ['March''April''May''June''July']
  2. result = max(l, key = len)

PHP

  1. $array = array('March''April''May''June''July');
  2. $result = array_reduce($array, create_function('$a, $b''return (strlen($a) > strlen($b) ? $a : $b);'));

Perl

  1. my @array = qw/March April May June July/;
  2. my ($result) = sort { length $b <=> length $a } @array;         # ソート結果の配列を長さ1の配列に押し込んで、先頭以外を捨てる
  1. # use List::Util;
  2. my @array = qw/March April May June July/;
  3. my $result = List::Util::reduce { length $a > length $b ? $a : $b } @array;
  1. # use List::Util;
  2. my @array = qw/March April May June July/;
  3. my $max_length = List::Util::max(map length, @array);
  4. my $result = List::Util::first { length == $max_length } @array;

リストから最も長い文字列を全て取り出す

Java

Java 8以降

  1. // import java.util.stream.Collectors;
  2. // import java.util.stream.Stream;
  3. Stream<String> stream = Stream.of("March""April""May""June""July");
  4. List<String> result = stream.collect(Collectors.groupingBy(s -> s.length()))
  5.     .entrySet().stream()
  6.     .max(Comparator.comparing(e -> e.getKey()))
  7.     .get().getValue();

Java 7まで

  1. String[] array = {"March""April""May""June""July"};
  2. List<String> result = new ArrayList<String>();
  3. int maxLength = 0;
  4. for (String s : array) {
  5.     if (s.length() > maxLength) {
  6.         result.clear();
  7.         maxLength = s.length();
  8.     }
  9.     if (s.length() == maxLength) {
  10.         result.add(s);
  11.     }
  12. }
Commons Collections 4.0以降を使った場合
  1. // import org.apache.commons.collections4.map.MultiValueMap;
  2. String[] array = {"March""April""May""June""July"};
  3. MultiValueMap<Integer, String> map = new MultiValueMap<>();
  4. for (String s : array) {
  5.     map.put(s.length(), s);
  6. }
  7. Integer maxLength = Collections.max(map.keySet());
  8. Collection<String> result = map.getCollection(maxLength);
Guava を使った場合
  1. // import com.google.common.collect.*;
  2. String[] array = {"March""April""May""June""July"};
  3. Multimap<Integer, String> map = ArrayListMultimap.create();
  4. for (String s : array) {
  5.     map.put(s.length(), s);
  6. }
  7. Integer maxLength = Ordering.natural().max(map.keys());
  8. Collection<String> result = map.get(maxLength);
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.*;
  3. List<String> list = Arrays.asList("March""April""May""June""July");
  4. Multimap<Integer, String> map = Multimaps.index(list, new Function<String, Integer>() {
  5.     @Override
  6.     public Integer apply(String input) {
  7.         return input.length();
  8.     }
  9. });
  10. Integer maxLength = Ordering.natural().max(map.keys());
  11. Collection<String> result = map.get(maxLength);

Groovy

  1. def list = ['March''April''May''June''July']
  2. def maxLength = list.collect { it.length() }.max()
  3. def result = list.findAll { it.length() == maxLength }
  1. def list = ['March''April''May''June''July']
  2. def maxLength = list*.length().max()
  3. def result = list.findAll { it.length() == maxLength }
  1. def list = ['March''April''May''June''July']
  2. def map = list.groupBy { it.length() }
  3. def maxLength = map.keySet().max()
  4. def result = map[maxLength]

Scala

  1. val list = List("March""April""May""June""July")
  2. val maxLength = list.map(_.length).max
  3. val result = list.filter(_.length == maxLength)                             // result の型は List[String]
  1. val list = List("March""April""May""June""July")
  2. val map = list.groupBy(_.length)
  3. val result = map(map.keys.max)                                              // result の型は List[String]
  1. val list = List("March""April""May""June""July")
  2. val tupleList = for (s <- list) yield (s, s.length)
  3. val maxLength = (for ((_, length) <- tupleList) yield length).max
  4. val result = for ((s, `maxLength`) <- tupleList) yield s                    // result の型は List[String]
  1. val list = List("March""April""May""June""July")
  2. val tupleList = list.map(s => (s, s.length)).sortBy(_._2).reverse
  3. val (_, maxLength) :: _ = tupleList
  4. val result = tupleList.takeWhile(_._2 == maxLength).map(_._1)               // result の型は List[String]

Erlang

  1. List = ["March""April""May""June""July"],
  2. TupleList = [{S, length(S)} || S <- List],
  3. MaxLength = lists:max([Length || {_, Length} <- TupleList]),
  4. Result = [S || {S, Length} <- TupleList, Length =:= MaxLength].

Haskell

  1. let list = ["March""April""May""June""July"]
  2. let result = [s | s <- list, length s == maxLength] where
  3.     maxLength = maximum $ map length list
  1. -- import Control.Monad
  2. let list = ["March""April""May""June""July"]
  3. let maxLength = maximum $ map length list
  4. let result = do
  5.     s <- list
  6.     guard $ length s == maxLength
  7.     return s
  1. let list = ["March""April""May""June""July"]
  2. let result = [s | (s, length) <- tupleList, length == maxLength] where
  3.     tupleList = [(s, length s) | s <- list]
  4.     maxLength = maximum [length | (_, length) <- tupleList]

PowerShell

  1. $array = 'March''April''May''June''July'
  2. $result = ($array | group Length | sort Name -Descending)[0].Group
  1. $array = 'March''April''May''June''July'
  2. $m = $array | measure Length -Maximum
  3. $result = $array | where { $_.Length -eq $m.Maximum }

F#

  1. let list = ["March""April""May""June""July"]
  2. let result = list |> Seq.groupBy String.length |> Seq.maxBy fst |> snd
  1. let list = ["March""April""May""June""July"]
  2. let maxLength = list |> List.map (fun s -> s.Length) |> List.max
  3. let result = list |> List.filter (fun s -> s.Length = maxLength)
  1. let list = ["March""April""May""June""July"]
  2. let maxLength = List.max [for s in list -> s.Length]
  3. let result = [for s in list do if s.Length = maxLength then yield s]
  1. let list = ["March""April""May""June""July"]
  2. let tupleList = [for s in list -> (s, s.Length)]
  3. let maxLength = tupleList |> List.map snd |> List.max
  4. let result = [for (s, length) in tupleList do if length = maxLength then yield s]
F# 3.0以降
  1. let list = ["March""April""May""June""July"]
  2. let result = query { for s in list do
  3.                      groupBy s.Length into grp
  4.                      sortByDescending grp.Key
  5.                      head }
  1. let list = ["March""April""May""June""July"]
  2. let maxLength = query { for s in list do
  3.                         maxBy s.Length }
  4. let result = query { for s in list do
  5.                      where (s.Length = maxLength) }

C#

C# 3.0以降
  1. string[] array = { "March""April""May""June""July" };
  2. var result = array.GroupBy(s => s.Length).OrderByDescending(grp => grp.Key).First();        // result の型は IGrouping<int, string>
  1. string[] array = { "March""April""May""June""July" };
  2. var groups = array.GroupBy(s => s.Length);
  3. var maxLength = groups.Max(grp => grp.Key);
  4. var result = groups.First(grp => grp.Key == maxLength);                 // result の型は IGrouping<int, string>
  1. string[] array = { "March""April""May""June""July" };
  2. var sorted = array.OrderByDescending(s => s.Length);
  3. var maxLength = sorted.First().Length;
  4. var result = sorted.TakeWhile(s => s.Length == maxLength);              // result の型は IEnumerable<int>
  1. string[] array = { "March""April""May""June""July" };
  2. var query = from s in array
  3.             group s by s.Length into grp
  4.             orderby grp.Key descending
  5.             select grp;
  6. var result = query.First();                                             // result の型は IGrouping<int, string>
C# 2.0
  1. string[] array = { "March""April""May""June""July" };
  2. string[] result = (string[])array.Clone();                              // 配列をコピーする
  3. int[] lengthArray = Array.ConvertAll(result, delegate (string s) { return - s.Length; });
  4. Array.Sort(lengthArray, result);                                        // lengthArray を使って result をソートする
  5. int maxLength = lengthArray[0];
  6. int secondIndex = Array.FindIndex(lengthArray, delegate (int length) { return length != maxLength; });
  7. if (secondIndex > 0) {
  8.     Array.Resize(ref result, secondIndex);
  9. }

C++

  1. #include <vector>
  2. int get_length(const string& s) {
  3.     return s.size();
  4. }
  5. struct shorter {
  6.     int max_length;
  7.     shorter(const vector<string>& v) {
  8.         vector<int> lengths(v.size());
  9.         transform(v.begin(), v.end(), lengths.begin(), get_length);
  10.         max_length = *max_element(lengths.begin(), lengths.end());
  11.     }
  12.     bool operator()(const string& s) {
  13.         return s.size() < max_length;
  14.     }
  15. };
  1. const int N = 5;
  2. string array[] = {"March""April""May""June""July"};
  3. vector<string> v(array, array + N);
  4. vector<string> result(N);
  5. vector<string>::iterator result_end = remove_copy_if(v.begin(), v.end(), result.begin(), shorter(v));
  6. result.resize(result_end - result.begin());

Go

  1. // インターフェース iterable.Grouper を実装する
  2. type LengthGrouper struct{}
  3. func (*LengthGrouper) Key(s interface{}) interface{} {
  4.     return len(s.(string))
  5. }
  6. func (*LengthGrouper) Equal(a, b interface{}) bool {
  7.     return a.(int) == b.(int)
  8. }
  9. // インターフェース sort.Interface を実装する
  10. type IntKeyDescending []interface{}
  11. func (this IntKeyDescending) key(i intint {
  12.     return this[i].(iterable.Group).Key.(int)
  13. }
  14. func (this IntKeyDescending) Len() int {
  15.     return len(this)
  16. }
  17. func (this IntKeyDescending) Less(i, j intbool {
  18.     return this.key(i) > this.key(j)
  19. }
  20. func (this IntKeyDescending) Swap(i, j int) {
  21.     this[i], this[j] = this[j], this[i]
  22. }
  1. // import "exp/iterable"
  2. // import "sort"
  3. array := [...]string{"March""April""May""June""July"}
  4. var grouper *LengthGrouper
  5. groupIter := iterable.GroupBy(iterable.StringArray(array[:]), grouper)
  6. groups := iterable.Data(groupIter)                                          // groups の型は iterable.Group のスライス
  7. sort.Sort(IntKeyDescending(groups))
  8. result := iterable.Data(groups[0].(iterable.Group).Vals)                    // result の型は string のスライス

Dart

  1. List<String> list = ['March''April''May''June''July'];
  2. var map = new Map<int, List<String>>();
  3. for (String s in list) {
  4.     map.putIfAbsent(s.length, () => []).add(s);
  5. }
  6. List<int> keys = new List.from(map.getKeys());
  7. keys.sort((a, b) => b - a);
  8. List<String> result = map[keys[0]];

ActionScript

  1. var array:Array = ['March''April''May''June''July'];
  2. array.sort(function(x:String, y:String):int { return y.length - x.length; });
  3. var maxLength:int = array[0].length;
  4. var result:Array = array.filter(function(s:*, index:int, array:Array):Boolean {
  5.     return s.length == maxLength;
  6. });

JavaScript

  1. var array = ['March''April''May''June''July'];
  2. var result = [];
  3. var maxLength = 0;
  4. for (var i in array) {
  5.     var len = array[i].length;
  6.     if (len > maxLength) {
  7.         result = [];
  8.         maxLength = len;
  9.     }
  10.     if (len == maxLength) {
  11.         result.push(array[i]);
  12.     }
  13. }
prototype.js を使った場合
  1. var array = ['March''April''May''June''July'];
  2. var maxLength = array.max(function (s, i) { return s.length; });
  3. var result = array.findAll(function (s, i) { return s.length == maxLength; });
  1. var array = ['March''April''May''June''July'];
  2. var maxLength = array.pluck('length').max();
  3. var result = array.select(function (s, i) { return s.length == maxLength; });

CoffeeScript

  1. array = ['March''April''May''June''July']
  2. result = []
  3. maxLength = 0
  4. for s in array
  5.     len = s.length
  6.     if len > maxLength
  7.         result = []
  8.         maxLength = len
  9.     if len == maxLength
  10.         result.push s
prototype.js を使った場合
  1. array = ['March''April''May''June''July']
  2. maxLength = array.max (s, i) -> s.length
  3. result = array.findAll (s, i) -> s.length == maxLength
  1. array = ['March''April''May''June''July']
  2. maxLength = array.pluck('length').max()
  3. result = array.select (s, i) -> s.length == maxLength

Lua

  1. function groupby(t, getkey)
  2.     local groups = {}
  3.     for _, value in pairs(t) do
  4.         local key = getkey(value)
  5.         if groups[key] == nil then
  6.             groups[key] = { value }
  7.         else
  8.             table.insert(groups[key], value)
  9.         end
  10.     end
  11.     return groups
  12. end
  13. function getkeys(t)
  14.     local keys = {}
  15.     for key, _ in pairs(t) do
  16.         table.insert(keys, key)
  17.     end
  18.     return keys
  19. end
  1. t = { 'March''April''May''June''July' }
  2. t2 = groupby(t, string.len)
  3. lengths = getkeys(t2)
  4. table.sort(lengths)
  5. result = t2[lengths[#lengths]]

Ruby

  1. array = %w[March April May June July]
  2. hash = {}
  3. array.each {|s| (hash[s.size] ||= []) << s }
  4. result = hash[hash.keys.max]
  1. array = %w[March April May June July]
  2. hash = Hash.new {|h, key| h[key] = [] }
  3. array.each {|s| hash[s.size] << s }
  4. result = hash[hash.keys.max]
Ruby 1.8まで+Ruby on Rails の場合
  1. array = %w[March April May June July]
  2. result = array.group_by {|s| s.size }.sort_by {|grp| grp[0] }.last[1]
Ruby 1.9以降+Ruby on Rails の場合
  1. array = %w[March April May June July]
  2. result = array.group_by {|s| s.size }.max_by {|grp| grp[0] }[1]

Python

  1. # import itertools
  2. l = ['March''April''May''June''July']
  3. max_length = max(map(len, l))
  4. result = [s for s in l if len(s) == max_length]
  1. # import itertools
  2. l = ['March''April''May''June''July']
  3. d = dict((key, list(values)) for key, values in itertools.groupby(l, len))
  4. result = d[max(d)]

PHP

  1. $array = array('March''April''May''June''July');
  2. $dict = array();
  3. foreach ($array as $s) {
  4.     $len = strlen($s);
  5.     if (! array_key_exists($len$dict)) {
  6.         $dict[$len] = array();
  7.     }
  8.     array_push($dict[$len], $s);
  9. }
  10. krsort($dict);
  11. $result = current($dict);

Perl

  1. # use List::Util;
  2. my @array = qw/March April May June July/;
  3. my $max_length = List::Util::max(map length, @array);
  4. my @result = grep { length == $max_length } @array;
  1. # use List::Util;
  2. my @array = qw/March April May June July/;
  3. my $max_length = List::Util::max(map length, @array);
  4. my @result = map { length == $max_length ? $_ : () } @array;            # () は空の配列
  1. # use List::Util;
  2. my @array = qw/March April May June July/;
  3. my %hash;
  4. push @{$hash{length $_}}, $_ for @array;
  5. my @result = @{$hash{List::Util::max keys %hash}};

整数のリストから偶数だけを取り出す

Java

Java 8以降

  1. // import java.util.stream.IntStream;
  2. IntStream stream = IntStream.of(0123456789);
  3. IntStream result = stream.filter(x -> x % 2 == 0);

Java 7まで

  1. int[] array = {0123456789};
  2. List<Integer> result = new ArrayList<Integer>();
  3. for (int x : array) {
  4.     if (x % 2 == 0) {
  5.         list.add(x);
  6.     }
  7. }
Commons Collections 4.0以降を使った場合
  1. // import org.apache.commons.collections4.*;
  2. List<Integer> list = Arrays.asList(0123456789);
  3. List<Integer> result = ListUtils.select(list, new Predicate<Integer>() {
  4.     @Override
  5.     public boolean evaluate(Integer object) {
  6.         return object % 2 == 0;
  7.     }
  8. });
Guava を使った場合
  1. // import com.google.common.base.Predicate;
  2. // import com.google.common.collect.*;
  3. SortedSet<Integer> set = Ranges.closed(09).asSet(DiscreteDomains.integers());
  4. Collection<Integer> result = Collections2.filter(set, new Predicate<Integer>() {
  5.     @Override
  6.     public boolean apply(Integer input) {
  7.         return input % 2 == 0;
  8.     }
  9. });

Groovy

  1. def list = 0..9
  2. def result = list.findAll { it % 2 == 0 }

Scala

  1. val range = 0 to 9
  2. val result = range.filter(_ % 2 == 0)
  1. val range = 0 to 9
  2. val result = for (x <- range if x % 2 == 0yield x

Erlang

  1. List = lists:seq(09),
  2. Result = [X || X <- List, X rem 2 =:= 0].
  1. List = lists:seq(09),
  2. Result = lists:filter(fun(X) -> X rem 2 =:= 0 end, List).

Haskell

  1. let list = [0..9]
  2. let result = [x | x <- list, x `mod` 2 == 0]
  1. let list = [0..9]
  2. let result = filter (\ x -> x `mod` 2 == 0) list

PowerShell

  1. $array = 0..9
  2. $result = $array | where { $_ % 2 -eq 0 }

F#

  1. let list = [0..9]
  2. let result = List.filter (fun x -> x % 2 = 0) list
  1. let list = [0..9]
  2. let result = list |> List.filter (fun x -> x % 2 = 0)
  1. let list = [0..9]
  2. let result = [for x in list do if x % 2 = 0 then yield x]
  1. let list = [0..9]
  2. let result = List.choose (fun x -> if x % 2 = 0 then Some x else None) list
  1. let list = [0..9]
  2. let result = List.choose (function x when x % 2 = 0 -> Some x | _ -> None) list
F# 3.0以降
  1. let list = [0..9]
  2. let result = query { for x in list do
  3.                      where (x % 2 = 0) }

C#

C# 3.0以降
  1. var e = Enumerable.Range(010);
  2. var result = e.Where(x => x % 2 == 0);                          // result の型は IEnumerable<int>
  1. var e = Enumerable.Range(010);
  2. var result = from x in e where x % 2 == 0 select x;             // result の型は IEnumerable<int>
C# 2.0
  1. int[] array = { 0123456789 };
  2. int[] result = Array.FindAll(array, delegate (int x) { return x % 2 == 0; });

C++

  1. bool is_odd(const int& x) {
  2.     return x % 2 != 0;
  3. }
  1. const int N = 10;
  2. int array[N] = {0123456789};
  3. int result[N];
  4. int* result_end = remove_copy_if(array, array + N, result, is_odd);
  5. // *result から *result_end までの範囲に結果が格納される
Boost を使った場合
  1. #include <algorithm>
  2. #include <boost/lambda/lambda.hpp>
  3. // using namespace boost::lambda;
  4. const int N = 10;
  5. int array[N] = {0123456789};
  6. int result[N];
  7. int* result_end = remove_copy_if(array, array + N, result, _1 % 2 != 0);
  8. // *result から *result_end までの範囲に結果が格納される

Go

  1. // import "exp/iterable"
  2. array := [...]int{0123456789}
  3. iter := iterable.Filter(iterable.IntArray(array[:]),
  4.     func(x interface{}) bool { return x.(int) % 2 == 0 })
  5. result := iterable.Data(iter)                                   // result の型は int のスライス

Dart

  1. List<int> list = [0123456789];
  2. List<int> result = list.filter((x) => x % 2 == 0);

ActionScript

  1. var array:Array = [0123456789];
  2. var result:Array = array.filter(
  3.     function(item:int, index:int, array:Array):Boolean { return item % 2 === 0; });

JavaScript

JavaScript 1.7(Firefox 2.0)以降
  1. var array = [0123456789];
  2. var result = [x for each (x in array) if (x % 2 == 0)];
JavaScript 1.6(Firefox 1.5)以降
  1. var array = [0123456789];
  2. var result = array.filter(function(x) { return x % 2 == 0; });
prototype.js を使った場合
  1. var array = [0123456789];
  2. var result = array.findAll(function (x, i) { return x % 2 == 0; });
jQuery を使った場合
  1. var array = [0123456789];
  2. var result = $.grep(array, function (x, i) { return x % 2 == 0; });
  1. var array = [0123456789];
  2. var result = $.grep(array, function (x, i) { return x % 2; }, true);
MochiKit を使った場合
  1. var array = list(range(010));
  2. var result = filter(function (x) { return x % 2 == 0; }, array);

CoffeeScript

  1. array = [0..9]
  2. result = (x for x in array when x % 2 == 0)

Lua

  1. function filter(t, predicate)
  2.     local result = {}
  3.     for _, value in pairs(t) do
  4.         if predicate(value) then
  5.             table.insert(result, value)
  6.         end
  7.     end
  8.     return result
  9. end
  1. t = { 0123456789 }
  2. result = filter(t, function(x) return x % 2 == 0 end)

Ruby

  1. range = 0..9
  2. result = range.select {|x| x % 2 == 0 }

Python

  1. l = range(010)                                # 0から9までのリスト
  2. result = [x for x in l if x % 2 == 0]
  1. l = range(010)                                # 0から9までのリスト
  2. result = filter(lambda x: x % 2 == 0, l)

PHP

PHP 5.3.0以降
  1. $array = array(0123456789);
  2. $result = array_filter($arrayfunction($x) { return $x % 2 === 0; });
PHP 5.2.xまで
  1. $array = array(0123456789);
  2. $result = array_filter($array, create_function('$x''return $x % 2 === 0;'));

Perl

  1. my @array = (0..9);
  2. my @result = grep { $_ % 2 == 0 } @array;
  1. my @array = (0..9);
  2. my @result = grep !($_ % 2), @array;
  1. my @array = (0..9);
  2. my @result = map { $_ % 2 ? () : $_ } @array;           # () は空の配列

整数のリストを偶数と奇数とに分ける関数

Java

Java 8以降

  1. // import java.util.stream.Collectors;
  2. // import java.util.stream.Stream;
  3. @SuppressWarnings("unchecked")
  4. public static List<Integer>[] evensAndOdds(Stream<Integer> ints) {
  5.     Map<Boolean, List<Integer>> map = ints.collect(Collectors.partitioningBy(i -> i % 2 == 0));
  6.     return new List[] {map.get(true), map.get(false)};
  7. }
  1. List<Integer>[] evensAndOdds = evensAndOdds(Stream.of(0123456789));
  2. List<Integer> evens = evensAndOdds[0];
  3. List<Integer> odds  = evensAndOdds[1];

Java 7まで

  1. public static List<Integer>[] evensAndOdds(int... ints) {
  2.     @SuppressWarnings("unchecked")
  3.     List<Integer>[] result = new List[] {new ArrayList<Integer>(), new ArrayList<Integer>()};
  4.     for (int i : ints) {
  5.         result[i % 2].add(i);
  6.     }
  7.     return result;
  8. }
Guava を使った場合
  1. // import com.google.common.base.Function;
  2. // import com.google.common.collect.*;
  3. @SuppressWarnings("unchecked")
  4. public static Collection<Integer>[] evensAndOdds(Iterable<Integer> ints) {
  5.     Multimap<Integer, Integer> map = Multimaps.index(ints, new Function<Integer, Integer>() {
  6.         @Override
  7.         public Integer apply(Integer input) {
  8.             return input % 2;
  9.         }
  10.     });
  11.     return new Collection[] {map.get(0), map.get(1)};
  12. }
  1. Collection<Integer>[] evensAndOdds = evensAndOdds(Ranges.closed(09).asSet(DiscreteDomains.integers()));
  2. Collection<Integer> evens = evensAndOdds[0];
  3. Collection<Integer> odds  = evensAndOdds[1];

Groovy

  1. def evensAndOdds(ints) {
  2.     ints.split { it % 2 == 0 }
  3. }
  1. def (evens, odds) = evensAndOdds(0..9)

Scala

  1. def evensAndOdds(iter: Iterable[Int]) = iter.partition(_ % 2 == 0)
  1. val (evens, odds) = evensAndOdds(0 to 9)

Erlang

  1. evens_and_odds(List) -> lists:partition(fun(X) -> X rem 2 =:= 0 end, List).
  1. evens_and_odds(List) -> evens_and_odds(List, [], []).
  2. evens_and_odds([Head|Tail], Evens, Odds) ->
  3.     case Head rem 2 of
  4.         0 -> evens_and_odds(Tail, [Head|Evens], Odds);
  5.         1 -> evens_and_odds(Tail, Evens, [Head|Odds])
  6.     end;
  7. evens_and_odds([], Evens, Odds) -> {lists:reverse(Evens), lists:reverse(Odds)}.
  1. {Evens, Odds} = evens_and_odds([0123456789]).

Haskell

  1. -- import List
  2. evensAndOdds = partition (\ x -> x `mod` 2 == 0)
  1. let (evens, odds) = evensAndOdds [0..9]

PowerShell

  1. function EvensAndOdds($ints) {
  2.     $result = @(@(), @());
  3.     $ints | foreach { $result[$_ % 2] += $_ }
  4.     $result
  5. }
  1. ($evens$odds) = EvensAndOdds @(0..9)

F#

  1. let evensAndOdds = List.partition (fun x -> x % 2 = 0)
  1. let evensAndOdds = List.partition <| fun x -> x % 2 = 0
  1. let evens, odds = evensAndOdds [0..9]

C#

C# 3.0以降
  1. public static void EvensAndOdds(IEnumerable<int> ints, out IEnumerable<int> evens, out IEnumerable<int> odds) {
  2.     var lookup = ints.ToLookup(x => x % 2);
  3.     evens = lookup[0];
  4.     odds  = lookup[1];
  5. }
  1. IEnumerable<int> evens;
  2. IEnumerable<int> odds;
  3. EvensAndOdds(Enumerable.Range(010), out evens, out odds);

C++

vector 専用

  1. #include <algorithm>
  2. #include <vector>
  3. struct is_even : unary_function<intbool> {
  4.     bool operator()(const int& x) const {
  5.         return x % 2 == 0;
  6.     }
  7. };
  8. void evens_and_odds(vector<int>& ints, vector<int>& evens, vector<int>& odds) {
  9.     vector<int>::iterator it = partition(ints.begin(), ints.end(), is_even());
  10.     evens = vector<int>(ints.begin(), it);
  11.     odds = vector<int>(it, ints.end());
  12. }
  1. const int N = 10;
  2. int array[N] = {0123456789};
  3. vector<int> ints(array, array + N);
  4. vector<int> evens, odds;
  5. evens_and_odds(ints, evens, odds);

vector のほか list などにも対応

  1. #include <algorithm>
  2. #include <vector>
  3. struct is_even : unary_function<intbool> {
  4.     bool operator()(const int& x) const {
  5.         return x % 2 == 0;
  6.     }
  7. };
  8. template <class T, typename I>
  9. void evens_and_odds(I begin, I end, T& evens, T& odds) {
  10.     I i = partition(begin, end, is_even());
  11.     evens = T(begin, i);
  12.     odds = T(i, end);
  13. }
  1. const int N = 10;
  2. int array[N] = {0123456789};
  3. vector<int> ints(array, array + N);
  4. vector<int> evens, odds;
  5. evens_and_odds(ints.begin(), ints.end(), evens, odds);

Go

  1. // import "exp/iterable"
  2. func EvensAndOdds(ints []int) (evens, odds []interface{}) {
  3.     intsIter := iterable.IntArray(ints)
  4.     evensIter, oddsIter := iterable.Partition(intsIter,
  5.         func(x interface{}) bool { return x.(int) % 2 == 0 })
  6.     evens = iterable.Data(evensIter)
  7.     odds  = iterable.Data(oddsIter)
  8.     return
  9. }
  1. evens, odds := EvensAndOdds([]int{0123456789})

Dart

  1. List<List<int>> evensAndOdds(Iterable<int> iter) {
  2.     List<List<int>> result = [[], []];
  3.     for (int x in iter) {
  4.         result[x % 2].add(x);
  5.     }
  6.     return result;
  7. }
  1. List<int> list = [0123456789];
  2. List<List<int>> result = evensAndOdds(list);
  3. List<int> evens = result[0];
  4. List<int> odds  = result[1];

ActionScript

  1. function evensAndOdds(...ints):Array {
  2.     var result:Array = [[], []];
  3.     for (var x:* in ints) {
  4.         result[x % 2].push(x);
  5.     }
  6.     return result;
  7. }
  1. var result:Array = evensAndOdds(0123456789);
  2. var evens:Array = result[0];
  3. var odds:Array  = result[1];

JavaScript

prototype.js を使った場合
  1. function evensAndOdds(array) {
  2.     return array.partition(function (x, i) { return x % 2 == 0; });
  3. }
  1. var result = evensAndOdds([0123456789]);
  2. var evens = result[0];
  3. var odds  = result[1];

CoffeeScript

prototype.js を使った場合
  1. evensAndOdds = (array) ->
  2.     array.partition (x, i) -> x % 2 == 0
  1. [evens, odds] = evensAndOdds [0..9]

Lua

  1. function evens_and_odds(...)
  2.     local t = { [0]={}, [1]={} }
  3.     for _, x in ipairs(arg) do
  4.         table.insert(t[x % 2], x)
  5.     end
  6.     return t[0], t[1]
  7. end
  1. evens, odds = evens_and_odds(0123456789)

Ruby

  1. def evens_and_odds array
  2.   array.partition {|x| x % 2 == 0 }
  3. end
  1. evens, odds = evens_and_odds 0..9

Python

  1. # import itertools
  2. def evens_and_odds(iter):
  3.     def keyfunc(x):
  4.         return x % 2
  5.     groups = {}
  6.     for mod, values in itertools.groupby(sorted(iter, key = keyfunc), key = keyfunc):
  7.         groups[mod] = list(values)
  8.     return groups[0], groups[1]
  1. evens, odds = evens_and_odds(range(010))

PHP

  1. function evens_and_odds($array) {
  2.     $result = array(array(), array());
  3.     foreach ($array as $n) {
  4.         array_push($result[$n % 2], $n);
  5.     }
  6.     return $result;
  7. }
  1. list($evens$odds) = evens_and_odds(array(0123456789));

Perl

  1. sub evens_and_odds {
  2.     my @result = ([], []);
  3.     push @{$result[$_ % 2]}, $_ for @_;
  4.     @result;
  5. }
  1. sub evens_and_odds {
  2.     my @evens@odds;
  3.     for (@_) {
  4.         my $ref = $_ % 2 ? \@odds : \@evens;
  5.         push @$ref$_;
  6.     }
  7.     \@evens\@odds;
  8. }
  1. my ($evens$odds) = &evens_and_odds(0123456789);
  2. # $evens、$odds はそれぞれ配列へのリファレンスになる

リストから重複した要素を取り除く

Java

Java 8以降
  1. // import java.util.stream.IntStream;
  2. IntStream stream = IntStream.of(24521740);
  3. IntStream result = stream.distinct();
Java 7まで
  1. List<Integer> list = Arrays.asList(24521740);
  2. Set<Integer> result = new HashSet<Integer>(list);

Groovy

  1. def list = [24521740]
  2. def result = list.unique()

Scala

  1. val list = List(24521740)
  2. val result = list.distinct
  1. val list = List(24521740)
  2. val result = Set(list: _*)

Erlang

  1. List = [24521740],
  2. Result = sets:from_list(List).

Haskell

  1. -- import List
  2. let list = [24521740]
  3. let result = nub list
Cabal の MissingH を使った場合
  1. -- import Data.List.Utils
  2. let list = [24521740]
  3. let result = uniq list

PowerShell

  1. $array = 24521740
  2. $result = $array | sort | Get-Unique

F#

  1. let list = [24521740]
  2. let result = Seq.distinct list
  1. let list = [24521740]
  2. let result = set list
  1. let list = [24521740]
  2. let result = Set.ofList list
F# 3.0以降
  1. let list = [24521740]
  2. let result = query { for x in list do
  3.                      distinct }

C#

C# 3.0以降
  1. int[] array = { 24521740 };
  2. var result = array.Distinct();                      // result の型は IEnumerable<int>
C# 2.0
  1. int[] array = { 24521740 };
  2. Dictionary<intobject> dict = new Dictionary<intobject>();
  3. foreach (int x in array) {
  4.     dict[x] = null;
  5. }
  6. ICollection<int> result = dict.Keys;

C++

  1. #include <algorithm>
  2. const int N = 10;
  3. int array[N] = {24521740};
  4. int result[N];
  5. copy(array, array + N, result);
  6. sort(result, result + N);
  7. int* result_end = unique(result, result + N);
  8. // *result から *result_end までの範囲に結果が格納される

Go

  1. // インターフェース iterable.Grouper を実装する
  2. type IntGrouper struct{}
  3. func (*IntGrouper) Key(x interface{}) interface{} {
  4.     return x
  5. }
  6. func (*IntGrouper) Equal(a, b interface{}) bool {
  7.     return a.(int) == b.(int)
  8. }
  1. // import "exp/iterable"
  2. // import "sort"
  3. array := [...]int{24521740}
  4. sort.SortInts(array[:])
  5. var grouper *IntGrouper
  6. iter := iterable.Unique(iterable.IntArray(array[:]), grouper)
  7. result := iterable.Data(iter)                                       // result の型は int のスライス

Dart

  1. List<int> list = [24521740];
  2. var result = new Set<int>.from(list);

ActionScript

  1. var array:Array = [24521740];
  2. array.sort();
  3. var result:Array = [array[0]];
  4. for (var i:int = 1; i < array.length; i++) {
  5.     if (array[i] !== array[i - 1]) {
  6.         result.push(array[i]);
  7.     }
  8. }

JavaScript

prototype.js を使った場合
  1. var array = [24521740];
  2. var result = array.uniq();
jQuery を使った場合
  1. var array = [24521740];
  2. var result = $.unique(array);

CoffeeScript

prototype.js を使った場合
  1. array = [24521740]
  2. result = array.uniq()
jQuery を使った場合
  1. array = [24521740]
  2. result = $.unique array

Lua

  1. t = { 24521740 }
  2. table.sort(t)
  3. result = { }
  4. for i, x in ipairs(t) do
  5.     if i == 0 or x ~= t[i - 1then
  6.         table.insert(result, x)
  7.     end
  8. end

Ruby

  1. array = [24521740]
  2. result = array.uniq

Python

  1. list = [24521740]
  2. s = set(list)

PHP

  1. $array = array(24521740);
  2. $result = array_unique($array);

Perl

  1. my @array = (24521740);
  2. my %hash;
  3. my @result = grep { $hash{$_}++ == 0 } @array;
  1. my @array = (24521740);
  2. my %hash;
  3. my @result = grep ! $hash{$_}++, @array;
CPAN の List::MoreUtils を使った場合
  1. # use List::MoreUtils;
  2. my @array = (24521740);
  3. my @result = List::MoreUtils::uniq @array;
CPAN の Array::Uniq を使った場合
  1. # use Array::Uniq;
  2. my @array = (24521740);
  3. my @result = uniq sort @array;

整数のリストの全要素を掛け算する

Java

Java 8以降
  1. // import java.util.stream.IntStream;
  2. IntStream stream = IntStream.of(2, -35);
  3. int result = stream.reduce(1, (left, right) -> left * right);
Java 7まで
  1. int[] array = {2, -35};
  2. int result = 1;
  3. for (int x : array) {
  4.     result *= x;
  5. }

Groovy

  1. def list = [2, -35]
  2. def result = list.inject(1) { x, y -> x * y }

Scala

  1. val list = List(2, -35)
  2. val result = list.product
  1. val list = List(2, -35)
  2. val result = list.reduceLeft(_ * _)
  1. val list = List(2, -35)
  2. val result = list.foldLeft(1)(_ * _)

Erlang

  1. List = [2, -35],
  2. Result = lists:foldl(fun(X, Y) -> X * Y end1, List).

Haskell

  1. let list = [2, -35]
  2. let result = product list
  1. let list = [2, -35]
  2. let result = foldl1 (*) list
  1. let list = [2, -35]
  2. let result = foldl (*) 1 list

PowerShell

  1. $array = 2, -35
  2. $result = 1
  3. $array | foreach { $result *= $_ }

F#

  1. let list = [2; -35]
  2. let result = List.reduce (*) list
  1. let list = [2; -35]
  2. let result = list |> List.reduce (*)
  1. let list = [2; -35]
  2. let result = List.fold (*) 1 list
  1. let list = [2; -35]
  2. let result = list |> List.fold (*) 1

C#

C# 3.0以降
  1. int[] array = { 2, -35 };
  2. var result = array.Aggregate((x, y) => x * y);
C# 2.0
  1. int[] array = { 2, -35 };
  2. int result = 1;
  3. foreach (int x in array) {
  4.     result *= x;
  5. }
  1. int[] array = { 2, -35 };
  2. int result = 1;
  3. Array.ForEach(array, delegate (int x) { result *= x; });

C++

  1. #include <numeric>
  2. const int N = 3;
  3. int array[N] = {2, -35};
  4. int result = accumulate(array, array + N, 1, multiplies<int>());
Boost を使った場合
  1. #include <numeric>
  2. #include <boost/lambda/lambda.hpp>
  3. // using namespace boost::lambda;
  4. const int N = 3;
  5. int array[N] = {2, -35};
  6. int result = accumulate(array, array + N, 1, _1 * _2);

Go

  1. // import "exp/iterable"
  2. array := [...]int{2, -35}
  3. multiplier := func(x, y interface{}) interface{} { return x.(int) * y.(int) }
  4. result := iterable.Inject(iterable.IntArray(array[:]), 1, multiplier).(int)

Dart

  1. List<int> list = [2, -35];
  2. int result = 1;
  3. for (int x in list) {
  4.     result *= x;
  5. }

ActionScript

  1. var array:Array = [2, -35];
  2. var result:int = 1;
  3. for each (var x:int in array) {
  4.     result *= x;
  5. }
  1. var array:Array = [2, -35];
  2. var result:int = 1;
  3. array.forEach(function(item:int, index:int, array:Array):void { result *= item; });

JavaScript

JavaScript 1.8(Firefox 3.0)以降
  1. var array = [2, -35];
  2. var result = array.reduce(function(x, y) x * y);
JavaScript 1.6(Firefox 1.5)以降
  1. var array = [2, -35];
  2. var result = 1;
  3. array.forEach(function(x) { result *= x; });
prototype.js を使った場合
  1. var array = [2, -35];
  2. var result = array.inject(1function(x, y, i) { return x * y; });
MochiKit を使った場合
  1. var array = [2, -35];
  2. var result = reduce(operator.mul, array);

CoffeeScript

JavaScript 1.8(Firefox 3.0)以降
  1. array = [2, -35]
  2. result = array.reduce (x, y) -> x * y
JavaScript 1.6(Firefox 1.5)以降
  1. array = [2, -35]
  2. result = 1
  3. array.forEach (x) -> result *= x
prototype.js を使った場合
  1. array = [2, -35]
  2. result = array.inject 1, (x, y, i) -> x * y
MochiKit を使った場合
  1. array = [2, -35]
  2. result = reduce operator.mul, array

Lua

  1. t = { 2, -35 }
  2. result = 1
  3. for _, x in ipairs(t) do
  4.     result = result * x
  5. end

Ruby

  1. array = [2, -35]
  2. result = array.inject {|x, y| x * y }
Ruby 1.9以降
  1. array = [2, -35]
  2. result = array.inject &:*

Python

Python 3.0以降
  1. # import functools
  2. l = [2, -35]
  3. result = functools.reduce(lambda x, y: x * y, l)
  1. # import functools
  2. # import operator
  3. l = [2, -35]
  4. result = functools.reduce(operator.mul, l)
Python 2.xまで
  1. l = [2, -35]
  2. result = reduce(lambda x, y: x * y, l)
  1. # import operator
  2. l = [2, -35]
  3. result = reduce(operator.mul, l)

PHP

  1. $array = array(2, -35);
  2. $result = array_product($array);
  1. $array = array(2, -35);
  2. $result = array_reduce($array, create_function('$x, $y''return $x * $y;'), 1);

Perl

  1. my @array = (2, -35);
  2. my $result = 1;
  3. for (@array) {
  4.     $result *= $_;
  5. }
  1. my @array = (2, -35);
  2. my $result = 1;
  3. $result *= $_ for @array;
  1. # use List::Util;
  2. my @array = (2, -35);
  3. my $result = List::Util::reduce { $a * $b } @array;
例えば "1,000+2,000+3,000" のような文字列を作る。

整数のリストの各要素を桁区切りありの文字列に変換し、それらを全て連結する

Java

Java 8以降

  1. // import java.util.stream.Collectors;
  2. // import java.util.stream.IntStream;
  3. IntStream stream = IntStream.of(100020003000);
  4. NumberFormat nf = NumberFormat.getInstance();
  5. String s = stream.mapToObj(nf::format).collect(Collectors.joining("+"));
Guava を使った場合
  1. // import java.util.stream.IntStream;
  2. // import com.google.common.base.Joiner;
  3. IntStream stream = IntStream.of(100020003000);
  4. NumberFormat nf = NumberFormat.getInstance();
  5. String s = Joiner.on('+').join(stream.mapToObj(nf::format).iterator());

Java 7まで

  1. int[] array = {100020003000};
  2. NumberFormat nf = NumberFormat.getInstance();
  3. StringBuilder sb = new StringBuilder();
  4. for (int x : array) {
  5.     sb.append("+").append(nf.format(x));
  6. }
  7. String s = sb.delete(01).toString();
  1. int[] array = {100020003000};
  2. Formatter formatter = new Formatter();
  3. for (int x : array) {
  4.     formatter.format("+%,d", x);
  5. }
  6. String s = formatter.toString().substring(1);
Commons Lang 3.0以降、Commons Collections 4.0以降を使った場合
  1. // import org.apache.commons.lang3.StringUtils;
  2. // import org.apache.commons.collections4.*;
  3. List<Integer> list = Arrays.asList(100020003000);
  4. final NumberFormat nf = NumberFormat.getInstance();
  5. Collection<String> c = CollectionUtils.collect(list, new Transformer<Integer, String>() {
  6.     @Override
  7.     public String transform(Integer input) {
  8.         return nf.format(input);
  9.     }
  10. });
  11. String s = StringUtils.join(c, "+");
Guava を使った場合
  1. // import com.google.common.base.*;
  2. // import com.google.common.collect.Iterables;
  3. // import com.google.common.primitives.Ints;
  4. List<Integer> list = Ints.asList(100020003000);
  5. final NumberFormat nf = NumberFormat.getInstance();
  6. Iterable<String> it = Iterables.transform(list, new Function<Integer, String>() {
  7.     @Override
  8.     public String apply(Integer input) {
  9.         return nf.format(input);
  10.     }
  11. });
  12. String s = Joiner.on('+').join(it);

Groovy

  1. def list = [100020003000]
  2. def s = list.collect(NumberFormat.instance.&format).join('+')
  1. def list = [100020003000]
  2. def s = list.collect { String.format '%,d', it }.join('+')

Scala

  1. val list = List(100020003000)
  2. val s = list.map(NumberFormat.getInstance.format).mkString("+")
  1. val list = List(100020003000)
  2. val s = list.map("%,d".format(_)).mkString("+")

Erlang

  1. List = [100020003000],
  2. %% 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. RE = "(\\d)(?=(?:\\d{3})+(?!\\d))",
  4. Converter = fun(X) ->
  5.                 re:replace(io_lib:format("+~b", [X]), RE, "\\1,", [{return, list}])
  6.             end,
  7. [_|S] = lists:flatten(lists:map(Converter, List)).

Haskell

  1. -- import Data.List
  2. -- 整数をカンマ区切りの文字列に変換する関数
  3. intToStr :: Integral a => a -> String
  4. intToStr n = reverse $ insertComma $ reverse $ show n
  5.     where insertComma (a : b : c : d : t) | (d /= '-') = a : b : c : ',' : insertComma (d : t)
  6.           insertComma t = t
  1. let list = [100020003000]
  2. let s = intercalate "+" $ map intToStr list
Cabal の MissingH を使った場合
  1. -- import Data.List.Utils
  2. -- 整数をカンマ区切りの文字列に変換する関数
  3. intToStr :: Integral a => a -> String
  4. intToStr n = reverse $ insertComma $ reverse $ show n
  5.     where insertComma ('-' : s) = '-' : insertComma s
  6.           insertComma s = join "," $ wholeMap (fixedWidth $ repeat 3) s
  1. let list = [100020003000]
  2. let s = join "+" $ map intToStr list

PowerShell

  1. $array = 100020003000
  2. $s = [string]::Join('+', ($array | foreach { $_.ToString('N0') }))
  1. $array = 100020003000
  2. $s = "$($array | foreach { $_.ToString('#,0') })" -replace ' ''+'

F#

  1. let list = [100020003000]
  2. let s = list |> List.map (fun x -> x.ToString "N0") |> String.concat "+"
  1. let list = [100020003000]
  2. let s = [for x in list -> x.ToString "#,0"] |> String.concat "+"
F# 3.0以降
  1. let list = [100020003000]
  2. let s = String.concat "+" <| query { for x in list do
  3.                                      select (x.ToString "#,0") }

C#

C# 3.0以降
  1. int[] array = { 100020003000 };
  2. var s = string.Join("+", Array.ConvertAll(array, x => x.ToString("N0")));
C# 2.0
  1. int[] array = { 100020003000 };
  2. string s = string.Join("+", Array.ConvertAll(array, delegate (int x) { return x.ToString("#,0"); }));

C++

Boost を使った場合
  1. #include <sstream>
  2. #include <vector>
  3. #include <boost/algorithm/string/join.hpp>
  4. #include <boost/regex.hpp>
  5. // 整数をカンマ区切りの文字列に変換する関数
  6. string number_format(const int n) {
  7.     stringstream ss;
  8.     ss << n;
  9.     // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  10.     boost::regex r("(\\d)(?=(?:\\d{3})+(?!\\d))");
  11.     return boost::regex_replace(ss.str(), r, "$1,", boost::format_all);
  12. }
  1. const int N = 3;
  2. int array[N] = {100020003000};
  3. vector<string> v(N);
  4. transform(array, array + N, v.begin(), number_format);
  5. string s = boost::algorithm::join(v, "+");

Go

  1. func IntToStr(x intstring {
  2.     buf := bytes.NewBufferString("")
  3.     s := strconv.Itoa(x)
  4.     if s[0] == '-' {
  5.         buf.WriteString("-")
  6.         s = s[1:]
  7.     }
  8.     for i, c := range(s) {
  9.         if i > 0 && (len(s) - i) % 3 == 0 {
  10.             buf.WriteString(",")
  11.         }
  12.         buf.WriteString(string(c))
  13.     }
  14.     return buf.String()
  15. }
  1. array := [...]int{100020003000}
  2. buf := bytes.NewBufferString("")
  3. for i, x := range(array) {
  4.     if i > 0 {
  5.         buf.WriteString("+")
  6.     }
  7.     buf.WriteString(IntToStr(x))
  8. }
  9. s := buf.String()

Dart

  1. String replaceAll(RegExp re, String str, Function replace) {
  2.     var sb = new StringBuffer();
  3.     int index = 0;
  4.     for (Match m in re.allMatches(str)) {
  5.         sb.add(str.substring(index, m.start()));
  6.         sb.add(replace(m));
  7.         index = m.end();
  8.     }
  9.     sb.add(str.substring(index));
  10.     return sb.toString();
  11. }
  1. List<int> list = [100020003000];
  2. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. RegExp re = const RegExp(@'\d(?=(?:\d{3})+(?!\d))');
  4. List<String> list2 = list.map((x) => replaceAll(re, '${x}', (m) => '${m[0]},'));
  5. String s = Strings.join(list2, '+');

ActionScript

  1. // import mx.formatters.NumberFormatter;
  2. var array:Array = [100020003000];
  3. var nf:NumberFormatter = new NumberFormatter();
  4. var s:String = array.map(
  5.     function(item:int, index:int, array:Array):String { return nf.format(item); }
  6. ).join('+');

JavaScript

  1. var array = [100020003000];
  2. var array2 = [];
  3. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  4. var re = /(\d)(?=(?:\d{3})+(?!\d))/g;
  5. for (var i in array) {
  6.     array2.push(array[i].toString().replace(re, '$1,'));
  7. }
  8. var s = array2.join('+');
JavaScript 1.7(Firefox 2.0)以降
  1. var array = [100020003000];
  2. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. var re = /(\d)(?=(?:\d{3})+(?!\d))/g;
  4. var s = [x.toString().replace(re, '$1,'for each (x in array)].join('+');
JavaScript 1.6(Firefox 1.5)以降
  1. var array = [100020003000];
  2. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. var re = /(\d)(?=(?:\d{3})+(?!\d))/g;
  4. var s = array.map(function(x) {
  5.     return x.toString().replace(re, '$1,');
  6. }).join('+');
prototype.js を使った場合
  1. var array = [100020003000];
  2. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. var re = /(\d)(?=(?:\d{3})+(?!\d))/g;
  4. var s = array.map(function(x) {
  5.     return x.toString().replace(re, '$1,');
  6. }).join('+');
jQuery を使った場合
  1. var array = [100020003000];
  2. // 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. var re = /(\d)(?=(?:\d{3})+(?!\d))/g;
  4. var s = $.map(array, function(x) {
  5.     return x.toString().replace(re, '$1,');
  6. }).join('+');
MochiKit を使った場合
  1. var array = [100020003000];
  2. var result = (map(numberFormatter('#,##0'), array)).join('+');

CoffeeScript

  1. array = [100020003000]
  2. # 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. re = /(\d)(?=(?:\d{3})+(?!\d))/g
  4. s = (s.toString().replace re, '$1,' for s in array).join '+'
MochiKit を使った場合
  1. array = [100020003000]
  2. result = (map (numberFormatter '#,##0'), array).join '+'

Lua

  1. function intToStr(x)
  2.     s1 = tostring(x):reverse()
  3.     while true do
  4.         s2 = s1:gsub('(%d%d%d)(%d)''%1,%2')
  5.         if s2 == s1 then
  6.             return s2:reverse()
  7.         end
  8.         s1 = s2
  9.     end
  10. end
  1. t = { 100020003000 }
  2. s = ''
  3. for i, x in ipairs(t) do
  4.     if i > 1 then s = s .. '+' end
  5.     s = s .. intToStr(x)
  6. end

Ruby

  1. array = [100020003000]
  2. # 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. re = /(\d)(?=(?:\d{3})+(?!\d))/
  4. s = array.collect {|x| x.to_s.gsub(re, '\1,') }.join('+')
Ruby on Rails の場合
  1. array = [100020003000]
  2. s = array.collect {|x| number_with_delimiter x }.join('+')

Python

  1. # import locale
  2. # locale.setlocale(locale.LC_ALL, '')
  3. l = [100020003000]
  4. s = '+'.join(locale.format('%d', x, grouping = Truefor x in l)
  1. # import local
  2. # locale.setlocale(locale.LC_ALL, '')
  3. l = [100020003000]
  4. s = '+'.join(map(lambda x: locale.format('%d', x, grouping = True), l))

PHP

  1. $array = array(100020003000);
  2. $s = implode('+', array_map('number_format'$array));

Perl

  1. my @array = (100020003000);
  2. # 数字が3の倍数個連続しているときに、その直前にある数字にマッチする正規表現
  3. my $re = q/(\d)(?=(?:\d{3})+(?!\d))/;
  4. my $s = join '+', map { s/$re/$1,/g$_ } @array;
CPAN の Number::Format を使った場合
  1. # use Number::Format;
  2. my @array = (100020003000);
  3. my $s = join '+', map { Number::Format::format_number $_ } @array;

月の名前のリストからXMLを生成する

例えば下記のようになる。
  1. <ul class="months">
  2.   <li>March</li>
  3.   <li>April</li>
  4.   <li>May</li>
  5.   <li>June</li>
  6.   <li>July</li>
  7. </ul>

Java

  1. // import java.io.StringWriter;
  2. // import javax.xml.transform.*;
  3. // import javax.xml.transform.dom.DomSource;
  4. // import javax.xml.transform.stream.StreamResult;
  5. // import org.w3c.dom.*;
  6. String[] array = {"March""April""May""June""July"};
  7. Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  8. Element ulElem = doc.createElement("ul");
  9. ulElem.setAttribute("class""months");
  10. for (String s : array) {
  11.     Element liElem = doc.createElement("li");
  12.     liElem.appendChild(doc.createTextNode(s));
  13.     ulElem.appendChild(liElem);
  14. }
  15. Transformer t = TransformerFactory.newInstance().newTransformer();
  16. t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  17. StringWriter sw = new StringWriter();
  18. t.transform(new DOMSource(ulElem), new StreamResult(sw));
  19. String xml = sw.toString();
Commons Jelly を使った場合
  1. // import java.io.*;
  2. // import org.apache.commons.jelly.*;
  3. // import org.xml.sax.InputSource;
  4. String[] array = {"March""April""May""June""July"};
  5. String template = "<j:jelly xmlns:j='jelly:core'>"
  6.                 + "    <ul class='months'>"
  7.                 + "        <j:forEach items='${array}' var='s'><li>${s}</li></j:forEach>"
  8.                 + "    </ul>"
  9.                 + "</j:jelly>";
  10. InputSource source = new InputSource(new StringReader(template));
  11. JellyContext context = new JellyContext();
  12. context.setVariable("array", array);
  13. StringWriter sw = new StringWriter();
  14. context.runScript(source, XMLOutput.createXMLOutput(sw));
  15. String xml = sw.toString();

Groovy

  1. // import groovy.xml.MarkupBuilder
  2. def list = ['March''April''May''June''July']
  3. def sw = new StringWriter()
  4. def mb = new MarkupBuilder(sw)
  5. mb.ul(class'months') {
  6.     for (s in list) { li s }
  7. }
  8. def xml = sw as String
  1. // import groovy.xml.StreamingMarkupBuilder
  2. def list = ['March''April''May''June''July']
  3. def w = new StreamingMarkupBuilder().bind {
  4.     ul(class'months') {
  5.         for (s in list) { li s }
  6.     }
  7. }
  8. def xml = w as String
  1. // import javax.xml.transform.*
  2. // import javax.xml.transform.dom.DOMSource
  3. // import javax.xml.transform.stream.StreamResult
  4. // import groovy.xml.DOMBuilder
  5. // import groovy.xml.dom.DOMCategory
  6. def list = ['March''April''May''June''July']
  7. def b = DOMBuilder.newInstance()
  8. def elem = b.ul(class'months') {
  9.     for (s in list) { li s }
  10. }
  11. def t = TransformerFactory.newInstance().newTransformer()
  12. t.setOutputProperty OutputKeys.OMIT_XML_DECLARATION, 'yes'
  13. def sw = new StringWriter()
  14. t.transform new DOMSource(elem), new StreamResult(sw)
  15. def xml = sw as String
Commons Jelly を使った場合
  1. // import org.apache.commons.jelly.*
  2. // import org.xml.sax.InputSource
  3. def list = ['March''April''May''June''July']
  4. def template = '''
  5. <j:jelly xmlns:j="jelly:core">
  6.     <ul class="months">
  7.         <j:forEach items="${list}" var="s"><li>${s}</li></j:forEach>
  8.     </ul>
  9. </j:jelly>
  10. '''
  11. def context = new JellyContext()
  12. context.setVariable 'list', list
  13. def source = new InputSource(new StringReader(template))
  14. def sw = new StringWriter()
  15. context.runScript source, XMLOutput.createXMLOutput(sw)
  16. def xml = sw as String

Scala

  1. val list = List("March""April""May""June""July")
  2. val ulElem = <ul class="months">{ for (s <- list) yield <li>{ s }</li> }</ul>           // ulElem の型は scala.xml.Elem
  3. val xml = ulElem.toString
  1. val list = List("March""April""May""June""July")
  2. val ulElem = <ul class="months">{ list.map(s => <li>{ s }</li>) }</ul>                  // ulElem の型は scala.xml.Elem
  3. val xml = ulElem.toString

Haskell

Cabal の xml を使った場合
  1. -- import Text.XML.Light.Output
  2. -- import Text.XML.Light.Types
  3. let list = ["March""April""May""June""July"]
  4. let q name = QName name Nothing Nothing
  5. let li s = Element (q "li") [] [Text $ CData CDataText s Nothing] Nothing
  6. let ul = Element (q "ul") [Attr (q "class""months"] (map (Elem . li) list) Nothing
  7. let xml = showElement ul

PowerShell

  1. $array = "March""April""May""June""July"
  2. $xml = [string]::Join("", @("<ul class=""months"">"$array | foreach { "<li>$_</li>" }; "</ul>"))
  1. $array = "March""April""May""June""July"
  2. $xml = @"
  3.     <ul class="months">
  4.         $($array | foreach { "<li>$_</li>" })
  5.     </ul>
  6. "@

F#

  1. // open System.Xml.Linq
  2. let list = ["March""April""May""June""July"]
  3. let ulElem = new XElement(XName.Get "ul",
  4.                 new XAttribute(XName.Get "class""month"),
  5.                 [| for s in list -> new XElement(XName.Get "li", s) |])
  6. let xml = string ulElem

C#

C# 3.0以降
  1. // using System.Xml.Linq;
  2. string[] array = { "March""April""May""June""July" };
  3. var ulElem = new XElement("ul",
  4.     new XAttribute("class""months"),
  5.     from s in array select new XElement("li", s));
  6. string xml = ulElem.ToString();
  1. // using System.Xml.Linq;
  2. string[] array = { "March""April""May""June""July" };
  3. var ulElem = new XElement("ul",
  4.     new XAttribute("class""months"),
  5.     array.Select(s => new XElement("li", s)));
  6. string xml = ulElem.ToString();
C# 2.0
  1. // using System.Xml;
  2. string[] array = { "March""April""May""June""July" };
  3. XmlDocument doc = new XmlDocument();
  4. XmlElement ulElem = doc.CreateElement("ul");
  5. ulElem.SetAttribute("class""months");
  6. foreach (string s in array) {
  7.     XmlElement liElem = doc.CreateElement("li");
  8.     liElem.AppendChild(doc.CreateTextNode(s));
  9.     ulElem.AppendChild(liElem);
  10. }
  11. string xml = ulElem.OuterXml;

ActionScript

  1. var array:Array = ['March''April''May''June''July'];
  2. var ul:XML = <ul class="months"></ul>;
  3. for each (var s:String in array) {
  4.     ul.appendChild(<li>{s}</li>);
  5. }
  6. var xml:String = ul.toXMLString();

JavaScript

jQuery を使った場合
  1. var months = ['March''April''May''June''July'];
  2. var ul = $('<ul class="months" />');
  3. $.each(months, function(_, s) { ul.append($('<li />').text(s)); });
  4. var xml = $('<_ />').append(ul).html();

CoffeeScript

jQuery を使った場合
  1. months = ['March''April''May''June''July']
  2. ul = $('<ul class="months" />')
  3. for s in months
  4.     ul.append $('<li />').text(s)
  5. xml = $('<_ />').append(ul).html()

Ruby

  1. # require 'rexml/document'
  2. array = %w[March April May June July]
  3. ul = REXML::Element.new 'ul'
  4. ul.add_attribute 'class''months'
  5. array.each {|s| ul.add_element('li').text = s }
  6. xml = ul.to_s
DOMなどを使わない場合
  1. array = %w[March April May June July]
  2. xml = "<ul class=\"months\">#{ array.collect {|s| "<li>#{s}</li>" } }</ul>"
  1. # require 'erb'
  2. array = %w[March April May June July]
  3. erb = <<'END'
  4.   <ul class="months">
  5.     <%- for s in array -%>
  6.       <li><%= s %></li>
  7.     <%- end -%>
  8.   </ul>
  9. END
  10. xml = ERB.new(erb, nil'-').result
XML Builder を使った場合
  1. # require 'builder/xmlmarkup'
  2. array = %w[March April May June July]
  3. x = Builder::XmlMarkup.new
  4. xml = x.ul(:class => :months) {
  5.   array.each {|s| x.li s }
  6. }
Nokogiri を使った場合
  1. # require 'nokogiri'
  2. array = %w[March April May June July]
  3. builder = Nokogiri::XML::Builder.new {
  4.   ul(:class => :months) {
  5.     array.each {|s| li s }
  6.   }
  7. }
  8. xml = builder.doc.root.to_xml

Python

  1. # import xml.dom
  2. l = ['March''April''May''June''July']
  3. doc = xml.dom.getDOMImplementation().createDocument(NoneNoneNone)
  4. ulElem = doc.createElement('ul')
  5. ulElem.setAttribute('class''months')
  6. for s in l:
  7.     liElem = doc.createElement('li')
  8.     liElem.appendChild(doc.createTextNode(s))
  9.     ulElem.appendChild(liElem)
  10. xml = ulElem.toxml()

PHP

  1. $array = array('March''April''May''June''July');
  2. $ulElem = new SimpleXMLElement('<ul />');
  3. $ulElem->addAttribute('class''months');
  4. foreach ($array as $s) {
  5.     $ulElem->addChild('li'$s);
  6. }
  7. $xml = $ulElem->asXML();
  1. $array = array('March''April''May''June''July');
  2. $doc = new DOMDocument();
  3. $ulElem = $doc->createElement('ul');
  4. $ulElem->setAttribute('class''months');
  5. $doc->appendChild($ulElem);
  6. foreach ($array as $s) {
  7.     $ulElem->appendChild($doc->createElement('li'$s));
  8. }
  9. $xml = $doc->saveXML($ulElem);

Perl

CPAN の XML::Generator を使った場合
  1. # use XML::Generator;
  2. my @array = qw/March April May June July/;
  3. my $x = XML::Generator->new;
  4. my $xml = $x->ul({class => 'months'}, map { $x->li($_) } @array);
CPAN の XML::DOM を使った場合
  1. # use XML::DOM;
  2. my @array = qw/March April May June July/;
  3. my $doc = XML::DOM::Document->new;
  4. my $ulElem = $doc->createElement('ul');
  5. $ulElem->setAttribute('class''months');
  6. $doc->appendChild($ulElem);
  7. for (@array) {
  8.     my $liElem = $doc->createElement('li');
  9.     $liElem->appendChild($doc->createTextNode($_));
  10.     $ulElem->appendChild($liElem);
  11. }
  12. my $xml = $ulElem->toString;

フィボナッチ数列をエンドレスで生成する関数

Java

Java 8以降
  1. // import java.util.stream.Stream;
  2. public static IntStream fibonacciNumbers() {
  3.     int[] seed = {01};
  4.     Stream<int[]> stream = Stream.iterate(seed, arr -> new int[] {arr[1], arr[0] + arr[1]});
  5.     return stream.mapToInt(arr -> arr[0]);
  6. }
  1. for (int n : (Iterable<Integer>) () -> fibonacciNumbers().iterator()) {
  2.     if (n > 20) {
  3.         break;
  4.     }
  5.     System.out.println(n);
  6. }
Java 7まで
  1. public static Iterable<Integer> fibonacciNumbers() {
  2.     return new Iterable<Integer>() {
  3.         @Override
  4.         public Iterator<Integer> iterator() {
  5.             return new Iterator<Integer>() {
  6.                 private int i = 0;
  7.                 private int j = 1;
  8.                 @Override
  9.                 public boolean hasNext() {
  10.                     return true;
  11.                 }
  12.                 @Override
  13.                 public Integer next() {
  14.                     int tmp = i;
  15.                     i = j;
  16.                     j += tmp;
  17.                     return tmp;
  18.                 }
  19.                 @Override
  20.                 public void remove() {
  21.                 }
  22.             };
  23.         }
  24.     };
  25. }
  1. for (int n : fibonacciNumbers()) {
  2.     if (n > 20) {
  3.         break;
  4.     }
  5.     System.out.println(n);
  6. }

Groovy

Java 8以降で Groovy 2.2以降
  1. // import java.util.stream.Stream
  2. def fibonacciNumbers() {
  3.     def seed = [01]
  4.     Stream.iterate(seed) { [it[1], it[0] + it[1]] }.mapToInt { it[0] }
  5. }
  1. for (n in ({ fibonacciNumbers().iterator() } as Iterable)) {
  2.     if (n > 20) {
  3.         break
  4.     }
  5.     println(n)
  6. }
Java 7まで
  1. def fibonacciNumbers() {
  2.     new Iterator() {
  3.         private i = 0
  4.         private j = 1
  5.         @Override boolean hasNext() { true }
  6.         @Override Integer next() {
  7.             def tmp = i
  8.             i = j
  9.             j += tmp
  10.             tmp
  11.         }
  12.         @Override void remove() {}
  13.     }
  14. }
  1. for (n in fibonacciNumbers()) {
  2.     if (n > 20) {
  3.         break
  4.     }
  5.     println(n)
  6. }

Scala

  1. def fibonacciNumbers = {
  2.     def f(i: Int, j: Int): Stream[Int] = i #:: f(j, i + j)
  3.     f(01)
  4. }
  1. def fibonacciNumbers = Stream.iterate((01)) { case (i, j) => (j, i + j) }.map { case (i, j) => i }
  1. fibonacciNumbers.takeWhile(n => n <= 20).foreach(println)

Erlang

  1. %% Func は、数列の値を引数に取り、繰り返しを続けるかどうかを true/false で返す関数
  2. fibonacci_numbers(Func) -> fibonacci_numbers(01, Func).
  3. fibonacci_numbers(I, J, Func) -> Func(I) andalso fibonacci_numbers(J, I + J, Func).
  1. fibonacci_numbers(fun(N) ->
  2.                       if
  3.                           N > 20 -> false;                              %% 20を超えたら終了
  4.                           true -> io:format("~p~n", [N]), true          %% それ以外なら出力を行って次へ
  5.                       end
  6.                   end).
  1. fibonacci_numbers(fun(N) -> N =< 20 andalso io:format("~p~n", [N]) =:= ok end).

Haskell

  1. fibonacciNumbers = 0 : 1 : zipWith (+) fibonacciNumbers (tail fibonacciNumbers)
  1. fibonacciNumbers @(_ : t) = 0 : 1 : zipWith (+) fibonacciNumbers t
  1. -- import List
  2. fibonacciNumbers = unfoldr (\ (i, j) -> Just (i, (j, i + j))) (01)
  1. mapM_ print $ takeWhile (<= 20) fibonacciNumbers

F#

  1. let fibonacciNumbers() =
  2.     let f (i, j) = Some(i, (j, i + j))
  3.     Seq.unfold f (01)
  1. let fibonacciNumbers() =
  2.     let rec f i j = seq {
  3.         yield i
  4.         yield! f j (i + j)
  5.     }
  6.     f 0 1
  1. let fibonacciNumbers() = seq {
  2.     let state = ref (01)
  3.     while true do
  4.         let (i, j) = !state
  5.         yield i
  6.         state := (j, i + j)
  7. }
  1. fibonacciNumbers() |> Seq.takeWhile (fun n -> n <= 20) |> Seq.iter (printfn "%d")
  1. fibonacciNumbers() |> Seq.takeWhile ((>=) 20) |> Seq.iter (printfn "%d")
F# 3.0以降
  1. Seq.iter (printfn "%d") <| query { for n in fibonacciNumbers() do
  2.                                    takeWhile (n <= 20) }

C#

  1. public static IEnumerable<int> FibonacciNumbers() {
  2.     int i = 0;
  3.     int j = 1;
  4.     for (;;) {
  5.         yield return i;
  6.         int tmp = i;
  7.         i = j;
  8.         j += tmp;
  9.     }
  10. }
  1. IEnumerable<int> numbers = FibonacciNumbers();
  2. foreach (var n in numbers) {
  3.     if (n > 20) {
  4.         break;
  5.     }
  6.     Console.WriteLine(n);
  7. }

Go

  1. func fibonacciNumbers() <-chan int {
  2.     ch := make(chan int)
  3.     go func() {
  4.         i, j := 01
  5.         for {
  6.             ch <- i
  7.             i, j = j, i + j
  8.         }
  9.     } ()
  10.     return ch
  11. }
  1. numbers := fibonacciNumbers()
  2. for {
  3.     n := <- numbers
  4.     if n > 20 { break }
  5.     fmt.Printf("%d\n", n)
  6. }

Dart

  1. class FibonacciIterator extends Iterator<int> {
  2.     int i = 0;
  3.     int j = 1;
  4.     bool hasNext() => true;
  5.     int next() {
  6.         int tmp = i;
  7.         i = j;
  8.         j += tmp;
  9.         return tmp;
  10.     }
  11. }
  12. class FibonacciNumbers extends Iterable<int> {
  13.     Iterator<int> iterator() => new FibonacciIterator();
  14. }
  1. FibonacciNumbers numbers = new FibonacciNumbers();
  2. for (int n in numbers) {
  3.     if (n > 20) {
  4.         break;
  5.     }
  6.     print(n);
  7. }

ActionScript

  1. function fibonacciNumbers():Function {
  2.     var i:int = 0;
  3.     var j:int = 1;
  4.     return function():int {
  5.         var tmp:int = i;
  6.         i = j;
  7.         j += tmp;
  8.         return tmp;
  9.     };
  10. }
  1. var numbers:Function = fibonacciNumbers();
  2. for (var n:int; (n = numbers()) <= 20; ) {
  3.     trace(n);
  4. }

JavaScript

  1. function fibonacciNumbers() {
  2.     var i = 0;
  3.     var j = 1;
  4.     return function() {
  5.         var tmp = i;
  6.         i = j;
  7.         j += tmp;
  8.         return tmp;
  9.     };
  10. }
  1. var numbers = fibonacciNumbers();
  2. for (var n; (n = numbers()) <= 20; ) {
  3.     alert(n);
  4. }
JavaScript 1.7(Firefox 2.0)以降
  1. function fibonacciNumbers() {
  2.     var i = 0;
  3.     var j = 1;
  4.     while (true) {
  5.         yield i;
  6.         [i, j] = [j, i + j];
  7.     }
  8. }
  1. var numbers = fibonacciNumbers();
  2. for (var x in numbers) {
  3.     if (x > 20) {
  4.         break;
  5.     }
  6.     alert(x);
  7. }

CoffeeScript

  1. fibonacciNumbers = ->
  2.     [i, j] = [01]
  3.     -> ([_, i, j] = [i, j, i + j])[0]
  1. numbers = fibonacciNumbers()
  2. while (n = numbers()) <= 20
  3.     alert n

Lua

  1. function fibonacci_numbers()
  2.     local function iterator(_, t)
  3.         local i, j = unpack(t)
  4.         return {j, i + j}, i
  5.     end
  6.     return iterator, nil, { 01 }
  7. end
  1. for _, n in fibonacci_numbers() do
  2.     if n > 20 then
  3.         break
  4.     end
  5.     print(n)
  6. end

Ruby

  1. class FibonacciNumbers
  2.   include Enumerable
  3.   def each
  4.     i, j = 01
  5.     loop do
  6.       yield i
  7.       i, j = j, i + j
  8.     end
  9.   end
  10. end
  1. FibonacciNumbers.new.take_while {|n| n <= 20 }.each {|n| puts n }
Ruby 1.9以降
  1. def fibonacci_numbers
  2.   Enumerator.new do |y|
  3.     i, j = 01
  4.     loop do
  5.       y << i
  6.       i, j = j, i + j
  7.     end
  8.   end
  9. end
  1. fibonacci_numbers.take_while {|n| n <= 20 }.each {|n| puts n }
  1. # require 'fiber'
  2. def fibonacci_numbers
  3.   Fiber.new do
  4.     i, j = 01
  5.     loop do
  6.       Fiber.yield i
  7.       i, j = j, i + j
  8.     end
  9.   end
  10. end
  1. numbers = fibonacci_numbers
  2. while (n = numbers.resume) <= 20
  3.   puts n
  4. end

Python

  1. def fibonacci_numbers():
  2.     (i, j) = (01)
  3.     while True:
  4.         yield i
  5.         (i, j) = (j, i + j)
  1. for n in fibonacci_numbers():
  2.     if n > 20:
  3.         break
  4.     print(n)

PHP

  1. class FibonacciNumbers implements Iterator
  2. {
  3.     private $i$j;
  4.     public function current()
  5.     {
  6.         return $this->i;
  7.     }
  8.     public function key()
  9.     {
  10.     }
  11.     public function next()
  12.     {
  13.         $tmp = $this->i;
  14.         $this->i = $this->j;
  15.         $this->j += $tmp;
  16.     }
  17.     public function rewind()
  18.     {
  19.         $this->i = 0;
  20.         $this->j = 1;
  21.     }
  22.     public function valid()
  23.     {
  24.         return TRUE;
  25.     }
  26. }
  1. $numbers = new FibonacciNumbers();
  2. foreach ($numbers as $n) {
  3.     if ($n > 20) {
  4.         break;
  5.     }
  6.     echo $n"\n";
  7. }

Perl

  1. sub fibonacci_numbers {
  2.     my ($i$j) = (01);
  3.     return sub {
  4.         my $tmp = $i;
  5.         $i = $j;
  6.         $j += $tmp;
  7.         return $tmp;
  8.     };
  9. }
  1. my $numbers = fibonacci_numbers();
  2. while (($_ = $numbers->()) <= 20) {
  3.     print "$_\n";
  4. }

国のリストと都市のリストを結合し、日本以外の都市をコード順に出力する

Scala

  1. case class Country(code: String, name: String)
  2. case class City(countryCode: String, code: String, name: String)
  3. val countries = List(
  4.     Country("JP""日本"),
  5.     Country("US""アメリカ"),
  6.     Country("GB""イギリス")
  7. )
  8. val cities = List(
  9.     City("JP""TYO""東京"),
  10.     City("US""WAS""ワシントンD.C."),
  11.     City("US""NYC""ニューヨーク"),
  12.     City("GB""LON""ロンドン"),
  13.     City("GB""BHX""バーミンガム")
  14. )
  1. val result = for (ci <- cities; co @ Country(ci.countryCode, _) <- countries if co.name != "日本")
  2.     yield Map("countryCode" -> co.code, "countryName" -> co.name, "cityCode" -> ci.code, "cityName" -> ci.name)
  3. result.sort(_("cityCode") < _("cityCode")).foreach(m =>
  4.     println("%s:%s  %s:%s".format(m("countryCode"), m("countryName"), m("cityCode"), m("cityName"))))

Erlang

  1. -record(country, {code, name}).
  2. -record(city, {country_code, code, name}).
  1. Countries = [
  2.     #country{code = "JP", name = "日本"},
  3.     #country{code = "US", name = "アメリカ"},
  4.     #country{code = "GB", name = "イギリス"}
  5. ],
  6. Cities = [
  7.     #city{country_code = "JP", code = "TYO", name = "東京"},
  8.     #city{country_code = "US", code = "WAS", name = "ワシントンD.C."},
  9.     #city{country_code = "US", code = "NYC", name = "ニューヨーク"},
  10.     #city{country_code = "GB", code = "LON", name = "ロンドン"},
  11.     #city{country_code = "GB", code = "BHX", name = "バーミンガム"}
  12. ],
  1. List = [[Co#country.code, Co#country.name, Ci#city.code, Ci#city.name] || Ci <- Cities,
  2.                                                                           Co <- Countries,
  3.                                                                           Ci#city.country_code =:= Co#country.code,
  4.                                                                           Co#country.name =/= "日本"],
  5. Result = lists:sort(fun([_, _, CityCode1, _], [_, _, CityCode2, _]) -> CityCode1 =< CityCode2 end, List),
  6. [io:format("~s:~s  ~s:~s~n", R) || R <- Result].

Haskell

  1. data Country = Country String String
  2. data City = City String String String
  1. let countries = [Country "JP" "日本",
  2.                  Country "US" "アメリカ",
  3.                  Country "GB" "イギリス"
  4.                 ]
  5. let cities = [City "JP" "TYO" "東京",
  6.               City "US" "WAS" "ワシントンD.C.",
  7.               City "US" "NYC" "ニューヨーク",
  8.               City "GB" "LON" "ロンドン",
  9.               City "GB" "BHX" "バーミンガム"
  10.              ]
  11. let result = [(countryCode, countryName, cityCode, cityName)
  12.              |(City countryCode cityCode cityName) <- cities,
  13.               (Country countryCode' countryName) <- countries,
  14.               countryCode == countryCode',
  15.               countryName /= "日本"
  16.              ]
  17. mapM_ (putStrLn . f) result
  18.     where f (countryCode, countryName, cityCode, cityName) =
  19.               countryCode ++ ":" ++ countryName ++ "  " ++ cityCode ++ ":" ++ cityName

F#

  1. type Country = { Code : string; Name : string }
  2. type City = { CountryCode : string; Code : string; Name : string }
  3. let countries = [
  4.     { Country.Code = "JP"; Name = "日本" };
  5.     { Country.Code = "US"; Name = "アメリカ" };
  6.     { Country.Code = "GB"; Name = "イギリス" }
  7. ]
  8. let cities = [
  9.     { CountryCode = "JP"; Code = "TYO"; Name = "東京" };
  10.     { CountryCode = "US"; Code = "WAS"; Name = "ワシントンD.C." };
  11.     { CountryCode = "US"; Code = "NYC"; Name = "ニューヨーク" };
  12.     { CountryCode = "GB"; Code = "LON"; Name = "ロンドン" };
  13.     { CountryCode = "GB"; Code = "BHX"; Name = "バーミンガム" }
  14. ]
  1. let result = seq {
  2.     for ci in cities do
  3.         for co in countries do
  4.             if ci.CountryCode = co.Code && co.Name <> "日本" then
  5.                 yield Map.ofList [("countryCode", co.Code); ("countryName", co.Name); ("cityCode", ci.Code); ("cityName", ci.Name)]
  6. }
  7. result |> Seq.sortBy (fun m -> m.["cityCode"])
  8.     |> Seq.iter (fun m -> printfn "%s:%s  %s:%s" m.["countryCode"] m.["countryName"] m.["cityCode"] m.["cityName"])
F# 3.0以降
  1. let result = query {
  2.     for ci in cities do
  3.     join co in countries on (ci.CountryCode = co.Code)
  4.     where (co.Name <> "日本")
  5.     select (Map.ofList [("countryCode", co.Code); ("countryName", co.Name); ("cityCode", ci.Code); ("cityName", ci.Name)])
  6. }
  7. query { for m in result do
  8.         sortBy m.["cityCode"]
  9.         select (printfn "%s:%s  %s:%s" m.["countryCode"] m.["countryName"] m.["cityCode"] m.["cityName"])
  10.       } |> Seq.iter ignore

C#

C# 3.0以降
  1. var countries = new[] {
  2.     new {Code = "JP", Name = "日本"},
  3.     new {Code = "US", Name = "アメリカ"},
  4.     new {Code = "GB", Name = "イギリス"},
  5. };
  6. var cities = new[] {
  7.     new {CountryCode = "JP", Code = "TYO", Name = "東京"},
  8.     new {CountryCode = "US", Code = "WAS", Name = "ワシントンD.C."},
  9.     new {CountryCode = "US", Code = "NYC", Name = "ニューヨーク"},
  10.     new {CountryCode = "GB", Code = "LON", Name = "ロンドン"},
  11.     new {CountryCode = "GB", Code = "BHX", Name = "バーミンガム"},
  12. };
  1. var query = from ci in cities
  2.             join co in countries on ci.CountryCode equals co.Code
  3.             where co.Name != "日本"
  4.             orderby ci.Code
  5.             select new {CountryCode = co.Code, CountryName = co.Name, CityCode = ci.Code, CityName = ci.Name};
  6. foreach (var r in query) {
  7.     Console.WriteLine(string.Format("{0}:{1}  {2}:{3}", r.CountryCode, r.CountryName, r.CityCode, r.CityName));
  8. }

Ruby

リスト同士の結合を行う方法は用意されていないが、ハッシュを使って実現した例を示す。
  1. class Country
  2.   attr_reader :code:name
  3.   def initialize(code, name)
  4.     @code = code
  5.     @name = name
  6.   end
  7. end
  8. class City
  9.   attr_reader :country_code:code:name
  10.   def initialize(country_code, code, name)
  11.     @country_code = country_code
  12.     @code = code
  13.     @name = name
  14.   end
  15. end
  16. countries = [
  17.   Country.new('JP''日本'),
  18.   Country.new('US''アメリカ'),
  19.   Country.new('GB''イギリス'),
  20. ]
  21. cities = [
  22.   City.new('JP''TYO''東京'),
  23.   City.new('US''WAS''ワシントンD.C.'),
  24.   City.new('US''NYC''ニューヨーク'),
  25.   City.new('GB''LON''ロンドン'),
  26.   City.new('GB''BHX''バーミンガム'),
  27. ]
  1. hash = Hash[*countries.collect {|co| [co.code, co] }.flatten]
  2. array = cities.collect do |ci|
  3.   {:ci => ci, :co => hash[ci.country_code]}
  4. end
  5. array = array.select {|r| r[:co].name != '日本' }.sort_by {|r| r[:ci].code }
  6. array.collect! do |r|
  7.   {:country_code => r[:co].code, :country_name => r[:co].name, :city_code => r[:ci].code, :city_name => r[:ci].name}
  8. end
  9. puts array.collect do |r|
  10.   "#{r[:country_code]}:#{r[:country_name]}  #{r[:city_code]}:#{r[:city_name]}"
  11. end

Python

  1. class Country:
  2.     def __init__(self, code, name):
  3.         self.code = code
  4.         self.name = name
  5. class City:
  6.     def __init__(self, country_code, code, name):
  7.         self.country_code = country_code
  8.         self.code = code
  9.         self.name = name
  10. countries = [
  11.     Country('JP''日本'),
  12.     Country('US''アメリカ'),
  13.     Country('GB''イギリス'),
  14. ]
  15. cities = [
  16.     City('JP''TYO''東京'),
  17.     City('US''WAS''ワシントンD.C.'),
  18.     City('US''NYC''ニューヨーク'),
  19.     City('GB''LON''ロンドン'),
  20.     City('GB''BHX''バーミンガム'),
  21. ]
  1. result = [
  2.     {'country_code': co.code, 'country_name': co.name, 'city_code': ci.code, 'city_name': ci.name}
  3.     for ci in cities
  4.     for co in countries if ci.country_code == co.code and co.name != '日本'
  5. ]
  6. result.sort(key = lambda r: r['city_code'])
  7. for r in result:
  8.     print('%s:%s  %s:%s' % (r['country_code'], r['country_name'], r['city_code'], r['city_name']))

ポーカーの手を判定する関数

簡略化のため、ジョーカーはないものとして扱う。

Groovy

  1. enum Suit { CLUB, DIAMOND, HEART, SPADE }
  2. // リストの要素が連番になっているかどうか判定するクラス
  3. class IsSequential {
  4.     def isCase(list) {                              // switch 文で使えるようにするためのメソッド
  5.         def prev = list[0]
  6.         for (i in 1 .. list.size - 1) {
  7.             if (prev + 1 != list[i]) return false
  8.             prev = list[i]
  9.         }
  10.         return true
  11.     }
  12. }
  13. def isSequential() {
  14.     new IsSequential()
  15. }
  16. // リストの先頭の要素から順に値を検査するクラス
  17. class HasPrefix {
  18.     private prefix
  19.     HasPrefix(prefix) {                             // コンストラクタ
  20.         this.prefix = prefix
  21.     }
  22.     def isCase(list) {                              // switch 文で使えるようにするためのメソッド
  23.         for (i in 0 .. prefix.length - 1) {
  24.             if (i >= list.size || list[i] != prefix[i]) return false
  25.         }
  26.         return true
  27.     }
  28. }
  29. def hasPrefix(...prefix) {
  30.     new HasPrefix(prefix)
  31. }
  1. // ポーカーの手を判定する関数
  2. def checkPokerHand(cards) {
  3.     def suitCount = cards.collect { it[0] }.unique().size
  4.     def numbers = cards.collect { it[1] }.sort()
  5.     if (suitCount == 1) {                                       // スートが揃っている場合
  6.         switch (numbers) {
  7.         case isSequential():      return 'Straight Flash'
  8.         case [110111213]: return 'Royal Straight Flash'
  9.         default:                  return 'Flash'
  10.         }
  11.     } else {                                                    // スートが揃っていない場合
  12.         switch (numbers) {
  13.         case isSequential():      return 'Straight'
  14.         default:
  15.             def counts = numbers.groupBy { it }.values()*.size.sort().reverse()
  16.             switch (counts) {                                   // 数が同じカードの枚数で判定する
  17.             case hasPrefix(4   ): return 'Four of a Kind'
  18.             case hasPrefix(32): return 'Full House'
  19.             case hasPrefix(3   ): return 'Three of a Kind'
  20.             case hasPrefix(22): return 'Two Pair'
  21.             case hasPrefix(2   ): return 'One Pair'
  22.             default:              return 'No Pair'
  23.             }
  24.         }
  25.     }
  26. }
  1. def result = checkPokerHand([[Suit.CLUB, 8], [Suit.HEART, 8], [Suit.DIAMOND, 8], [Suit.SPADE, 4], [Suit.CLUB, 4]])

Scala

  1. // リストの要素が連番になっているか判定するオブジェクト
  2. case object Sequential {
  3.     def apply(numbers: List[Int]): Boolean =
  4.         numbers.sliding(2).forall { case Seq(n0, n1) => n0 + 1 == n1 }
  5.     def unapply(numbers: List[Int]) = apply(numbers)
  6. }
  1. // ポーカーの手を判定する関数
  2. def checkPokerHand[Suit](cards: List[(Suit, Int)]) = {
  3.     val suitCount = cards.map(_._1).distinct.length
  4.     val numbers = cards.map(_._2).sorted
  5.     if (suitCount == 1) {                                       // スートが揃っている場合
  6.         numbers match {
  7.         case Sequential()            => "Straight Flash"
  8.         case List(110111213) => "Royal Straight Flash"
  9.         case _                       => "Flash"
  10.         }
  11.     } else {                                                    // スートが揃っていない場合
  12.         numbers match {
  13.         case Sequential() => "Straight"
  14.         case _ =>
  15.             val counts = numbers.groupBy(identity).values.map(_.length).toList.sortWith(_ > _)
  16.             counts match {                                      // 数が同じカードの枚数で判定する
  17.             case 4 :: _      => "Four of a Kind"
  18.             case 3 :: 2 :: _ => "Full House"
  19.             case 3 :: _      => "Three of a Kind"
  20.             case 2 :: 2 :: _ => "Two Pair"
  21.             case 2 :: _      => "One Pair"
  22.             case _           => "No Pair"
  23.             }
  24.         }
  25.     }
  26. }
  1. val result = checkPokerHand(List(('club8), ('heart8), ('diamond8), ('spade4), ('club4)))

Erlang

  1. %% リストの要素を値別に数える関数
  2. count_elements(List) ->
  3.     Fun = fun(Elem, Dict) -> dict:update_counter(Elem, 1, Dict) end,
  4.     lists:foldl(Fun, dict:new(), List).
  5. %% リストの要素が連番になっているかどうか判定する関数
  6. is_sequential([N0, N1|T]) -> (N0 + 1 =:= N1) and is_sequential([N1|T]);
  7. is_sequential(_) -> true.
  1. %% ポーカーの手を判定する関数
  2. check_poker_hand(Cards) ->
  3.     Numbers = lists:sort(lists:map(fun({_, N}) -> N end, Cards)),
  4.     Sequential = is_sequential(Numbers),                                        %% if文の条件式のところに直接は書けないので、一旦変数に入れる
  5.     case Cards of
  6.         [{S, _}, {S, _}, {S, _}, {S, _}, {S, _}] ->                             %% スートが揃っている場合
  7.             if
  8.                 Sequential                      -> "Straight Flash";
  9.                 Numbers =:= [110111213] -> "Royal Straight Flash";
  10.                 true                            -> "Flash"
  11.             end;
  12.         [{_, _}, {_, _}, {_, _}, {_, _}, {_, _}] ->                             %% スートが揃っていない場合
  13.             if
  14.                 Sequential -> "Straight";
  15.                 true ->
  16.                     CountList = [Count || {_, Count} <- dict:to_list(count_elements(Numbers))],
  17.                     case lists:reverse(lists:sort(CountList)) of                %% 数が同じカードの枚数で判定する
  18.                         [4|_]    -> "Four of a Kind";
  19.                         [32|_] -> "Full House";
  20.                         [3|_]    -> "Three of a Kind";
  21.                         [22|_] -> "Two Pair";
  22.                         [2|_]    -> "One Pair";
  23.                         _        -> "No Pair"
  24.                     end
  25.             end
  26.    end.
  1. Result = check_poker_hand([{club, 8}, {heart, 8}, {diamond, 8}, {spade, 4}, {club, 4}]).

Haskell

GHC 6.10.1以降でビューパターンを使う
  1. -- import List
  2. data Suit = Club | Diamond | Heart | Spade deriving (Eq, Ord)
  3. -- リストの要素が連番になっているかどうかを判定する関数
  4. isSequential (n0 : n1 : t) = (n0 + 1 == n1) && isSequential (n1 : t)
  5. isSequential _ = True
  1. -- ポーカーの手を判定する関数
  2. checkPokerHand cards =
  3.     case suitCount of
  4.         1 -> case numbers of                                                -- スートが揃っている場合
  5.                  (isSequential -> True) -> "Straight Flash"
  6.                  [110111213]    -> "Royal Straight Flash"
  7.                  otherwise              -> "Flash"
  8.         _ -> case numbers of                                                -- スートが揃っていない場合
  9.                  (isSequential -> True) -> "Straight"
  10.                  otherwise -> case counts of                                -- 数が同じカードの枚数で判定する
  11.                                   4 : _     -> "Four of a Kind"
  12.                                   3 : 2 : _ -> "Full House"
  13.                                   3 : _     -> "Three of a Kind"
  14.                                   2 : 2 : _ -> "Two Pair"
  15.                                   2 : _     -> "One Pair"
  16.                                   _         -> "No Pair"
  17.     where suitCount = length $ nub $ map fst cards
  18.           numbers = sort $ map snd cards
  19.           counts = reverse $ sort $ map length $ group numbers
  1. let result = checkPokerHand [(Club, 8), (Heart, 8), (Diamond, 8), (Spade, 4), (Club, 4)]

F#

  1. type Suit = Club | Diamond | Heart | Spade
  2. // リストの要素が連番になっているかどうか判定する関数
  3. let isSequential = Seq.pairwise >> Seq.forall (fun (a, b) -> a + 1 = b)
  4. // アクティブなパターン(match 文で使う)
  5. let (|Sequential|_|) numbers = if isSequential numbers then Some() else None
  1. // ポーカーの手を判定する関数
  2. let checkPokerHand cards =
  3.     let suitCount = cards |> Seq.map fst |> Seq.distinct |> Seq.length
  4.     let numbers = cards |> Seq.map snd |> Seq.toList |> List.sort
  5.     if suitCount = 1 then                                               // スートが揃っている場合
  6.         match numbers with
  7.         | Sequential          -> "Straight Flash"
  8.         | [110111213] -> "Royal Straight Flash"
  9.         | _                   -> "Flash"
  10.     else                                                                // スートが揃っていない場合
  11.         match numbers with
  12.         | Sequential          -> "Straight"
  13.         | _ -> let counts = numbers |> Seq.groupBy id |> Seq.map (snd >> Seq.length) |> Seq.toList |> List.sort |> List.rev
  14.                match counts with                                        // 数が同じカードの枚数で判定する
  15.                | 4 :: _       -> "Four of a Kind"
  16.                | 3 :: 2 :: _  -> "Full House"
  17.                | 3 :: _       -> "Three of a Kind"
  18.                | 2 :: 2 :: _  -> "Two Pair"
  19.                | 2 :: _       -> "One Pair"
  20.                | _            -> "No Pair"
  1. let result = checkPokerHand [(Club, 8); (Heart, 8); (Diamond, 8); (Spade, 4); (Club, 4)]

C#

C# 3.0以降
  1. public enum Suit { Club, Diamond, Heart, Spade }
  2. public struct Card {
  3.     public Suit Suit  { getset; }
  4.     public int Number { getset; }
  5. }
  6. // リストの要素が連番になっているかどうか判定するメソッド
  7. public static bool IsSequential(this IEnumerable<int> e) {
  8.     var result = true;
  9.     e.Skip(1).Aggregate(e.First(), (prevNum, num) => {
  10.         result &= (prevNum + 1 == num);
  11.         return num;
  12.     });
  13.     return result;
  14. }
  15. // リストの先頭の要素から順に値を検査するメソッド
  16. public static bool HasPrefix<T>(this IEnumerable<T> e, params T[] prefix) {
  17.     var enumerator = e.GetEnumerator();
  18.     foreach (T t in prefix) {
  19.         if (! enumerator.MoveNext() || ! enumerator.Current.Equals(t)) {
  20.             return false;
  21.         }
  22.     }
  23.     return true;
  24. }
  1. // ポーカーの手を判定するメソッド
  2. public static string CheckPokerHand(IEnumerable<Card> cards) {
  3.     var suitCount = cards.Select(c => c.Suit).Distinct().Count();
  4.     var numbers = cards.Select(c => c.Number).OrderBy(n => n);
  5.     if (suitCount == 1) {                                                       // スートが揃っている場合
  6.         if (numbers.IsSequential())               return "Straight Flash";
  7.         if (numbers.HasPrefix(110111213)) return "Royal Straight Flash";
  8.         return "Flash";
  9.     } else {                                                                    // スートが揃っていない場合
  10.         if (numbers.IsSequential()) return "Straight";
  11.         var counts = numbers.GroupBy(n => n).Select(grp => grp.Count()).OrderByDescending(n => n);
  12.         if (counts.HasPrefix(4))    return "Four of a Kind";                    // 数が同じカードの枚数で判定する
  13.         if (counts.HasPrefix(32)) return "Full House";
  14.         if (counts.HasPrefix(3))    return "Three of a Kind";
  15.         if (counts.HasPrefix(22)) return "Two Pair";
  16.         if (counts.HasPrefix(2))    return "One Pair";
  17.         return "No Pair";
  18.     }
  19. }
  1. var result = CheckPokerHand(new Card[] {
  2.     new Card() { Suit = Suit.Club,    Number = 8 },
  3.     new Card() { Suit = Suit.Heart,   Number = 8 },
  4.     new Card() { Suit = Suit.Diamond, Number = 8 },
  5.     new Card() { Suit = Suit.Spade,   Number = 4 },
  6.     new Card() { Suit = Suit.Club,    Number = 4 }
  7. });

Ruby

Ruby 1.9以降
  1. # 配列の要素が連番になっているかどうか判定する関数
  2. def sequential?
  3.   lambda do |array|
  4.     result = true
  5.     array.inject do |prev_num, num|
  6.       result &= (prev_num + 1 == num)
  7.       num
  8.     end
  9.     result
  10.   end
  11. end
  12. # 配列の先頭の要素から順に値を検査する関数
  13. def prefix? *prefix
  14.   lambda {|array| array.first(prefix.length) == prefix }
  15. end
  1. # ポーカーの手を判定する関数
  2. def check_poker_hand cards
  3.   suit_count = cards.collect {|c| c[0] }.uniq.length
  4.   numbers = cards.collect {|c| c[1] }.sort
  5.   if suit_count == 1                                            # スートが揃っている場合
  6.     case numbers
  7.     when sequential?         ; 'Straight Flash'
  8.     when [110111213] ; 'Royal Straight Flash'
  9.     else                     ; 'Flash'
  10.     end
  11.   else                                                          # スートが揃っていない場合
  12.     case numbers
  13.     when sequential?     ; 'Straight'
  14.     else
  15.       counts = numbers.group_by(&:to_i).values.collect(&:count).sort.reverse
  16.       case counts                                               # 数が同じカードの枚数で判定する
  17.       when prefix?(4)    ; 'Four of a Kind'
  18.       when prefix?(32) ; 'Full House'
  19.       when prefix?(3)    ; 'Three of a Kind'
  20.       when prefix?(22) ; 'Two Pair'
  21.       when prefix?(2)    ; 'One Pair'
  22.       else               ; 'No Pair'
  23.       end
  24.     end
  25.   end
  26. end
  1. result = check_poker_hand [[:club8], [:heart8], [:diamond8], [:spade4], [:club4]]

Python

  1. # import itertools
  2. def pairwise(iterable):
  3.     a, b = itertools.tee(iterable)
  4.     next(b)
  5.     return zip(a, b)
  6. # リストの要素が連番になっているかどうか判定する関数
  7. def is_sequential(iterable):
  8.     for a, b in pairwise(iterable):
  9.         if a + 1 != b:
  10.             return False
  11.     return True
  12. # リストの先頭の要素から順に値を検査する関数
  13. def has_prefix(iterable, *prefix):
  14.     for a, b in zip(itertools.islice(iterable, 0, len(prefix)), prefix):
  15.         if a != b:
  16.             return False
  17.     return True
  1. # ポーカーの手を判定する関数
  2. def check_poker_hand(cards):
  3.     suit_count = len(set(c[0for c in cards))
  4.     numbers = sorted(c[1for c in cards)
  5.     if suit_count == 1:
  6.         return  ('Straight Flash'       if is_sequential(numbers)
  7.             else 'Royal Straight Flash' if numbers == [110111213]
  8.             else 'Flash')
  9.     else:
  10.         if is_sequential(numbers):
  11.             return 'Straight'
  12.         counts = sorted([len(list(g)) for _, g in itertools.groupby(numbers)], reverse = True)
  13.         return  ('Four of a Kind'  if has_prefix(counts, 4)
  14.             else 'Full House'      if has_prefix(counts, 32)
  15.             else 'Three of a Kind' if has_prefix(counts, 3)
  16.             else 'Two Pair'        if has_prefix(counts, 22)
  17.             else 'One Pair'        if has_prefix(counts, 2)
  18.             else 'No Pair')
  1. result = check_poker_hand([('club'8), ('heart'8), ('diamond'8), ('spade'4), ('club'4)])

戻る

目次

2つのリストを結合した新しいリストを作る Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
リスト内の文字列を短い順に出力する(元のリストを変更しない) Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
リスト内の文字列を短い順・辞書順に出力する(元のリストを変更して良い) Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
リストから最も長い文字列を1つだけ取り出す Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
リストから最も長い文字列を全て取り出す Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
整数のリストから偶数だけを取り出す Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
整数のリストを偶数と奇数とに分ける関数 Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
リストから重複した要素を取り除く Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
整数のリストの全要素を掛け算する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
整数のリストの各要素を桁区切りありの文字列に変換し、それらを全て連結する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
月の名前のリストからXMLを生成する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
フィボナッチ数列をエンドレスで生成する関数 Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
国のリストと都市のリストを結合し、日本以外の都市をコード順に出力する Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl
ポーカーの手を判定する関数 Java Groovy Scala Erlang Haskell PowerShell F# C# C++ Go Dart ActionScript JavaScript CoffeeScript Lua Ruby Python PHP Perl