Created
February 8, 2011 23:12
-
-
Save lfborjas/817504 to your computer and use it in GitHub Desktop.
Filter even numbers in a list; fork it for maximum fun!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#these are meant to be run in a REPL, and the java one in beanshell of something of the sort: | |
#ruby | |
[1,2,3,4].select{ |x| x.even? } | |
#python | |
[x for x in [1,2,3,4] if not x%2] | |
#or, more norvingly | |
filter(lambda x: not x%2, [1,2,3,4]) | |
#clojure | |
(filter #(even? % ) [1 2 3 4]) | |
#but we don't need the wrapper (thanks to the guys in hackernews:) | |
(filter even? [1 2 3 4]) | |
#scheme | |
(filter (lambda (x) (even? x)) '(1 2 3 4)) | |
#same here: | |
(filter even? '(1 2 3 4)) | |
#common lisp | |
(remove-if-not (lambda (x) (evenp x)) '(1 2 3 4)) | |
#and here: | |
(remove-if-not 'evenp '(1 2 3 4)) | |
#javascript | |
[1,2,3,4].filter(function(x){return !(x%2)}) | |
#java | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
public class filter { | |
public static void main (String [] args) | |
{ | |
Integer [] a = {1,2,3,4}; | |
System.out.println( | |
new ArrayList<Integer>(Arrays.asList(a)){{ | |
ArrayList<Integer> clon = (ArrayList<Integer>)this.clone(); | |
for(Integer e : clon){ | |
if(e.intValue()%2 != 0) | |
this.remove(e); | |
} | |
}} | |
); | |
} | |
} | |
#After reading comments here and on HN, I now see that trying to *remove* stuff (filter-out) in hopes | |
#of mimicking how it _looks_ in other languages is stupid, even the lisps are actually building a new list | |
#recursively, so, here's a java version (which I took from the commments below) which is much more | |
#idiomatic and fair, as it accomplishes the same as the others: not using more than one explicit variable, #and that one, bound: | |
public class filter { | |
public static void main (String [] args) | |
{ | |
System.out.println( | |
new java.util.ArrayList(){{ | |
for(Integer e : new Integer[]{1,2,3,4}) | |
if(e%2 == 0) this.add(e); | |
}} | |
); | |
} | |
} |
holy crap, in C with a linked list implementation baked in; now that's a really cool solution!
C#, using extension methods
using System;
using System.Collections.Generic;
using System.Linq;
static class Filter {
static void Main() {
//just getting the filtered list would look like:
//var filtered = 1.To( 4 ).Where( Even );
1.To( 4 ).If( Even, Console.WriteLine );
}
static IEnumerable<int> To( this int i, int to ) {
return Enumerable.Range( i, to - i + 1 );
}
static void If<T>( this IEnumerable<T> enumerable, Func<T,bool> predicate, Action<T> action ) {
enumerable.Where( predicate ).ToList().ForEach( action );
}
static bool Even( this int i ) {
return i % 2 == 0;
}
}
javascript 1.8
[1,2,3,4].filter(function (x) !(x%2))
Groovy
(1..4).findAll { !(it%2) }
(1..4).grep { !(it%2) }
C++
An improved C++ version:
#include <list>
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main (void)
{
list<int> numbers = {1,2,3,4};
remove_copy_if(numbers.begin(), numbers.end(), ostream_iterator<int>(cout, " "), [](int x) {return x % 2;});
}
Scala
(1 to 4).filter(_ % 2 == 0)
Tcl
Tcl lacks a built-in filter function, but it is easy to write:
proc filter {list script} { set res "" foreach e $list {if $script {lappend res $e}} return $res }
Then you have:
filter {1 2 3 4 5} {($e & 1)==0}
More succinct C++ version
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main (void)
{
int nums[] = {1,2,3,4};
remove_copy_if(nums, nums + 4, ostream_iterator<int>(cout, " "), [](int x) {return x % 2;});
return 0;
}
Oh, well:
Java:
Arrays.asList(1,2,3,4).stream().filter((i)-> i%2==0).collect(toList());
I have a problem in a loop while compiling this code giving error in this portion
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
C
And another imperative Haskell
import Data.IORef
main = do { a <- newIORef [1..4]; b <- newIORef []; l <- fmap length (readIORef a); r <- fmap (snd . head . dropWhile (not . null . fst)) (sequence $ replicate l (do { (i:as) <- readIORef a; if even i then modifyIORef b (++[i]) else return (); writeIORef a as; bs <- readIORef b; return (as,bs) })); print r }