Filter

From Rosetta Code
Revision as of 15:55, 4 April 2007 by rosettacode>Hdan (→‎[[Python]]: Added prolog code)
Task
Filter
You are encouraged to solve this task according to the task description, using any language you may know.

Select certain elements from an Array into a new Array in a generic way. To demonstrate, select all even numbers from an Array.

Ada

with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
with Ada.Text_Io; use Ada.Text_Io;

procedure Array_Selection is
   type Array_Type is array (Positive range <>) of Integer;
   Null_Array : Array_Type(1..0);
  
   function Evens (Item : Array_Type) return Array_Type is
   begin
      if Item'Length > 0 then
         if Item(Item'First) mod 2 = 0 then
            return Item(Item'First) & Evens(Item((Item'First + 1)..Item'Last));
         else
            return Evens(Item((Item'First + 1)..Item'Last));
         end if;
      else
         return Null_Array;
      end if;
   end Evens;
  
   procedure Print(Item : Array_Type) is
   begin
      for I in Item'range loop
         Put(Item(I));
         New_Line;
      end loop;
   end Print;
   
   Foo : Array_Type := (1,2,3,4,5,6,7,8,9,10);
begin
   Print(Evens(Foo));
end Array_Selection;

AppleScript

set array to {1, 2, 3, 4, 5}
set evens to {}
repeat with i in array
    -- very important -- list index starts at 1 not 0
    if (i mod 2 = 0) then set evens to evens & i
end repeat

C

       int arr[5] = {1,2,3,4,5};
       int *result;
       int memoryReqd = 0,length = sizeof(arr)/sizeof(arr[0]), i,j;
       for (i=0; i<length; i++)
       {
               if(0 == arr[i]%2)
               {
                       memoryReqd++;
               }
       }
       result = (int*)malloc(memoryReqd*sizeof(int));
       for(i=0,j=0; i<length; i++)
       {
               if(0 == arr[i]%2)
               {
                       result[j++]=arr[i];
               }
       }

Test our resultant array:

       for(i=0; i<memoryReqd; i++)
       {
               printf("%d\n",result[i]);
       }

C++

Compiler: Visual C++ 2005

Libraries: STL, Boost.Lambda

 using namespace std;
 using namespace boost::lambda;
 vector<int> ary(10);
 int i = 0;
 for_each(ary.begin(), ary.end(), _1 = ++var(i)); // init array
 vector<int> evens;
 remove_copy_if(ary.begin(), ary.end(), back_inserter(evens), _1 % 2); // filter copy

C#

       // .NET 1.x solution
       ArrayList array = new ArrayList( new int[] { 1, 2, 3, 4, 5 } );
       ArrayList evens = new ArrayList();
       foreach( int i in array )
       {
               if( (i%2) == 0 )
                       evens.Add( i );
       }
       foreach( int i in evens )
              System.Console.WriteLine( i.ToString() );
       // .NET 2.0 solution
       List<int> array = new List<int>( new int[] { 1, 2, 3, 4, 5 } );
       List<int> evens = array.FindAll( delegate( int i ) { return (i%2)==0; } );
       foreach( int i in evens )
              System.Console.WriteLine( i.ToString() );

Haskell

 ary = [1..10]
 evens = [ x | x <- ary, even x ]

IDL

The where() function can select elements on any logical expression. For example

 result = array[where(NOT array AND 1)]

Java

   int[] array = new int[] {1, 2, 3, 4, 5 };
   List<Integer> evensList = new ArrayList<Integer>();
   for (int  i: array) {
       if (i % 2 == 0) evensList.add(i);
   }
   int[] evens = evensList.toArray(new int[0]);

JavaScript

 var arr = [1,2,3,4,5];
 var evens = [];
 for (var i=0, ilen=arr.length; i<ilen; i++)
 	if (arr[i] % 2 == 0)
 		evens.push(arr[i]);

Interpreter: Firefox 2.0

var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var evens = [i for (i in numbers) if (i % 2 == 0)];

function range(limit) {
  for(var i = 0; i < limit; i++) {
    yield i;
  }
}

var evens2 = [i for (i in range(100)) if (i % 2 == 0)];

Perl

 my @list = (1, 2, 3, 4, 5, 6);
 my @even = grep { 0 == $_%2; } @list;

PHP

Using a standard loop

 $arr = range(1,5);
 $evens = array();
 foreach ($arr as $val){
 	if ($val % 2 == 0) $evens[] = $val);
 }
 print_r($evens);

Using a filter function

 function is_even($var) { return(!($var & 1)); }
 $arr = range(1,5);
 $evens = array_filter($arr, "is_even");
 print_r($evens);

Prolog

 evens(D, Es) :- bagof(X, (member(X, D), 0 is X mod 2), Es).

Usage:

 ?- evens([1,2,3,4,5,6,7,8,9,10],E).
 E = [2, 4, 6, 8, 10]

Python

values = range(10)
evens = [x for x in values if not(x & 1)]
ievens = (x for x in values if not(x & 1)) # lazy

Ruby

 ary = [1,2,3,4,5,6] #or ary = (1..6).to_a
 even_ary = ary.select{|el|el%2==0}
 # => [2, 4, 6]

Seed7

 var array integer: arr is [] (1, 2, 3, 4, 5);
 var array integer: evens is 0 times 0;
 var integer: number is 0;
 for number range arr do
   if not odd(number) then
     evens &:= [] (number);
   end if;
 end for;

Scala

val a = Array(1, 2, 3, 4, 5)
val even = a.filter{x => x % 2 == 0}

Or

val even = for(val x <- a; x % 2 == 0) yield x


SQL

Task: Select certain elements from an Array into a new Array in a generic way. To demonstrate, select all even numbers from an Array.

MS SQL

--Create the original array (table #nos) with numbers from 1 to 10
create table #nos (v int)
declare @n int set @n=1
while @n<=10 begin insert into #nos values (@n) set @n=@n+1 end

--Select the subset that are even into the new array (table #evens)
select v into #evens from #nos where v % 2 = 0

-- Show #evens
select * from #evens

-- Clean up so you can edit and repeat:
drop table #nos
drop table #evens

MySQL

create temporary table nos (v int);
insert into nos values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
create temporary table evens (v int);
insert into evens select v from nos where v%2=0;
select * from evens order by v; /*2,4,6,8,10*/
drop table nos;
drop table evens;

Or to be shorter, you could create the table evens directly from the query result :

create temporary table evens select * from nos where v%2=0;

Standard ML

 val ary = [1,2,3,4,5,6];
 List.filter (fn x => x mod 2 = 0) ary

Tcl

TCL doesn't really have a concept of a "number" per se - strictly speaking its only data type is the string (but a string can be interpreted as a number, of course). The generic way of getting certain elements from an array looks roughly like this:

 foreach key [array names arr] {if { <condition> } then {puts $arr($key)}}