J'ai un tableau 2D d'entiers (0 ou 1) comme so ...
error: incompatible types: inferred type does not conform to upper bound(s) .toArray(Boolean[][]::new); ^ inferred: Boolean[] upper bound(s): boolean[],Object
et je veux le convertir en un tableau 2D de booléens en utilisant des flux Java et .map ( ). Le tableau résultant étant:
boolean[][] gridBool = Arrays.stream(gridInt) .map(row -> Arrays.stream(row) .mapToObj(i -> i == 1) .toArray(Boolean[]::new) ) .toArray(Boolean[][]::new);
Ma dernière tentative était:
boolean[][] gridBool = { {false, false, false, true, false, false}, {false, false, true, true, false, false}, {true, false, true, false, false, true}, {false, false, false, false, true, false}, {false, true, false, false, false, false}, {false, false, false, false, false, false} };
Mais mon code ne se compile pas, l'erreur message est:
int [][] gridInt = { {0, 0, 0, 1, 0, 0}, {0, 0, 1, 1, 0, 0}, {1, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} };
Pouvez-vous me dire ce que je fais mal et comment y remédier? Merci.
3 Réponses :
Vous pouvez changer le Array
résultant en Boolean
:
Boolean[][] grid1bool = Arrays.stream(gridInt) .map(row -> Arrays.stream(row) .mapToObj(i -> i == 1) //Stream<Boolean> .toArray(Boolean[]::new) ) .toArray(Boolean[][]::new);
mapToObj
nécessite un Object
, pas le type primitif boolean
, nous ne pouvons donc pas utiliser toArray (boolean [] [] :: new)
.
si vous avez besoin d'un Boolean [] []
en conséquence, c'est aussi simple que de changer le type de récepteur de boolean
à Boolean
:
boolean[][] result = new boolean[gridInt.length][]; for (int i = 0; i < gridInt.length; i++) { boolean[] temp = new boolean[gridInt[i].length]; for (int j = 0; j < gridInt[i].length; j++) temp[j] = gridInt[i][j] == 1; result[i] = temp; }
Cependant, il semble que vous vouliez un booléen [] []
comme résultat; malheureusement, comme il n'y a pas de BooleanStream
, il ne serait pas judicieux d'effectuer cela via un flux car la lisibilité ou la concision n'est pas la meilleure, plutôt une approche impérative serait préférable:
Boolean[][] gridBool = Arrays.stream(gridInt) .map(row -> Arrays.stream(row) .mapToObj(i -> i == 1) .toArray(Boolean[]::new) ) .toArray(Boolean[][]::new);
Merci. J'ai pensé à l'approche itérative mais j'ai pensé que je pourrais d'une manière ou d'une autre utiliser l'approche cartographique pour la rendre plus facile / plus courte. Donc, je suppose que les flux ne fonctionnent pas bien avec les types primitifs autres que int, long et double? Ou du moins les rendre?
@EJC ouais, il y a eu un bon nombre de questions sur la raison pour laquelle il n'y a pas de CharStream
ou BooleanStream
. lorsque vous voulez convertir une séquence particulière d'un certain type en une séquence de char
ou boolean
ce n'est pas le plus lisible / concis et ne serait pas mieux que d'utiliser un impératif boucle car il n'y a pas de CharStream
ni de BooleanStream
, cependant, comme vous l'avez mentionné, les autres types primitifs ont des flux spécialisés pour chacun donc ils seraient pratiques.
@EJC si vous vouliez utiliser un flux pour cela, vous devrez déclarer un booléen [] [] result = new boolean [gridInt.length] [];
au préalable puis utiliser IntStream .range
+ forEach
pour faire le travail, ce qui est essentiellement ce que fait l'approche impérative ci-dessus, mais d'une manière plus idiomatique.
Vous pouvez simplement simplifier la logique comme suit:
boolean[][] gridBool = new boolean[gridInt.length][gridInt[0].length]; // NxN grid for (int i = 0; i < gridInt.length; i++) { for (int j = 0; j < gridInt[0].length; j++) { gridBool[i][j] = gridInt[i][j] != 0; } }
Remarque : cela évite une création de tableau temporaire pour chaque itération, d'où vous permet d’économiser de l’espace supplémentaire et initialise également le tableau avec des limites précises à l’avance.
booléen
n'est pasbooléen
!C'est facile - il suffit de changer une minuscule
b
en majusculeB
.Booléen [] [] gridBool
...