entera - division java decimales
¿Cuál es la mejor manera de dividir una colección en 2 colecciones diferentes? (6)
Puede usar Collectors.partitioningBy :
Map< Boolean, Set<Integer> > map =
mySet.stream().collect( Collectors.partitioningBy( y -> y % 2 == 0,
Collectors.toSet() ) );
Set<Integer> odds = map.get(Boolean.TRUE);
Set<Integer> evens = map.get(Boolean.FALSE);
EDITAR:
Veo que hay un par de respuestas similares. La pequeña diferencia aquí es que muestra cómo obtener las colecciones como Set
lugar de List en caso de que OP lo desee de esa manera.
Tengo un conjunto de números:
Set<Integer> mySet = [ 1,2,3,4,5,6,7,8,9]
Quiero dividirlo en 2 juegos de probabilidades y uniones.
Mi manera era usar el filtro dos veces:
Set<Integer> set1 = mySet.stream().filter(y -> y % 2 == 0).collect(Collectors.toSet())
Set<Integer> set2 =mySet.stream().filter(y -> y % 2 != 0).collect(Collectors.toSet())
No me gusta esta solución porque reviso todo el set dos veces.
¿Hay alguna forma más inteligente de hacerlo?
Puede usar la Collectors#partitioningBy
ejemplo, a continuación.
Map<Boolean,List<Integer>> evenOddMap = mySet.stream().collect(Collectors.partitioningBy(e -> e % 2 == 0));
System.out.println("Even : "+evenOddMap.get(true));
System.out.println("Odd : "+evenOddMap.get(false));
Puedes usar un groupingBy
public void test(String[] args) {
Integer[] test = {1,2,3,4,5,6,7,8,9};
Map<Integer, List<Integer>> evenOdd = Arrays.stream(test).collect(Collectors.groupingBy(i -> i & 1));
Set<Integer> evens = new HashSet<>(evenOdd.get(0));
Set<Integer> odds = new HashSet<>(evenOdd.get(1));
System.out.println("Evens "+evens+" Odds "+odds);
}
Siempre que tenga colecciones para mantener los valores, lo siguiente puede ser una solución.
data.stream().forEach(x -> {
if(x%2==0){
//add to collection holding even nums
} else {
//add to collection holding odd nums
}
})
Simple loop y if / else serían una solución limpia y simple
Set<Integer> setEven = new HashSet<>();
Set<Integer> setOdd = new HashSet<>();
for (Integer val : mySet) {
if (val % 2 == 0)
setEven.add(val);
else
setOdd.add(val);
}
O usar un operador ternario funciona bien para simplificar aún más el código
for(Integer val : mySet) {
((val % 2 == 0) ? setEven : setOdd).add(val);
}
Map<Boolean, List<Integer>> partitioned =
set.stream().collect(Collectors.partitioningBy(x -> x%2 == 0));
Los elementos en partitioned.get(true)
son pares; los elementos en partitioned.get(false)
son impares.
A diferencia de hacerlo usando groupingBy
, se garantiza que tanto false
listas true
como las false
estarán presentes en el mapa, incluso si están vacías. (No documentado en Java 8, pero era cierto, el documento de Java 9 ahora lo declara explícitamente).