2014-11-19 19 views
6

Devo essere in grado di creare un array booleano di una combinazione ed eseguirlo attraverso un programma per vedere se funziona. Altrimenti, lo caccio e vado alla combinazione successiva. Il mio problema è che non so come creare questo array perché n può essere uguale ovunque da 1-1000. Quindi stavo progettando di utilizzare Integer.toBinaryString ma non funzionerà a causa della sua dimensione troppo grande quando si arriva a 32. Qualsiasi aiuto sarebbe grande.Creazione di tutti i possibili modi di un array booleano di dimensione n?

Grazie!

+0

cos'è n? La lunghezza dell'array? – yts

+0

alcuni cicli 'for'? – zapl

+0

mi spiace, n è il numero di punti necessari per l'array booleano – Fischerk12

risposta

2

Il "risposta accettata" afferma che

Testato e questo lavoro per valori elevati di n, come 10000 e così via.

Ma questo è errato.

public static void main(String[] args) { 
    final int n = 3; 
    for (int i = 0; i < Math.pow(2, n); i++) { 
     String bin = Integer.toBinaryString(i); 
     while (bin.length() < n) 
      bin = "0" + bin; 
     char[] chars = bin.toCharArray(); 
     boolean[] boolArray = new boolean[n]; 
     for (int j = 0; j < chars.length; j++) { 
      boolArray[j] = chars[j] == '0' ? true : false; 
     } 
     System.out.println(Arrays.toString(boolArray)); 
    } 
} 

Quando n > 31 si esegue un loop infinito ripetendo le prime 2^31 combinazioni dal i volontà troppopieno e non raggiungerà mai Math.pow(2, n). Si può facilmente verificare questo con

public static void main2(String[] args){ 
     int n = 32; 
     for (int i = 0; i < Math.pow(2, n); i++){ 
      if (i == Integer.MIN_VALUE) { 
       // i overflows 
       System.out.println("i exceeded Integer.MAX_VALUE"); 
      } 
     } 
    } 

codice qui sopra a tempo indeterminato stampare i exceeded Integer.MAX_VALUE Tuttavia questo può facilmente essere corretto utilizzando BigInteger o una struttura dati simile per loop. Il codice seguente funzionerà per n <= Integer.MAX_VALUE

public static void main(String[] args) { 
    final int n = 32; 
    BigInteger bi = BigInteger.ZERO; 
    BigDecimal rows = new BigDecimal(Math.pow(2, n)); 
    while (bi.compareTo(rows.toBigInteger()) < 0) { 
     String bin = bi.toString(2);//Integer.toBinaryString(i); 
     while (bin.length() < n) 
      bin = "0" + bin; 
     char[] chars = bin.toCharArray(); 
     boolean[] boolArray = new boolean[n]; 
     for (int j = 0; j < chars.length; j++) { 
      boolArray[j] = chars[j] == '0' ? true : false; 
     } 
     System.out.println(Arrays.toString(boolArray)); 
     bi = bi.add(BigInteger.ONE); 
    } 
} 
3

Ho trovato la risposta al vostro problema su un altro SO question, e ho adattato per voi:

public class Foo { 
    public static void main(String[] args) { 
     final int n = 3; 
     for (int i = 0; i < Math.pow(2, n); i++) { 
      String bin = Integer.toBinaryString(i); 
      while (bin.length() < n) 
       bin = "0" + bin; 
      char[] chars = bin.toCharArray(); 
      boolean[] boolArray = new boolean[n]; 
      for (int j = 0; j < chars.length; j++) { 
       boolArray[j] = chars[j] == '0' ? true : false; 
      } 
      System.out.println(Arrays.toString(boolArray)); 
     } 
    } 
} 

produrrà:

[true, true, true] 
[true, true, false] 
[true, false, true] 
[true, false, false] 
[false, true, true] 
[false, true, false] 
[false, false, true] 
[false, false, false] 

Testato e questo funzionerà per alta valori di n, ad esempio 10000 e così via.

+0

Vedi ho visto che ma non avrebbe causato problemi dal momento che devo andare a 1000 punti diversi nella matrice quindi avrei bisogno di qualcosa con 1000 byte. – Fischerk12

+0

Sì, mio ​​cattivo. In realtà ricevo 'OutOfMemoryError' quando cerco numeri più alti per' n'. In tal caso, dovresti semplicemente creare 2^n matrici con una dimensione di [n]. Ho aggiornato la mia risposta. – victorantunes

+0

'for (int i = 0; i 31' si interromperà per sempre quando l'intero' i' sarà overflow come 'assertTrue (Integer.MAX_VALUE + 1 = = Integer.MIN_VALUE) 'Vedere la mia risposta per l'implementazione rettificata – SGal

Problemi correlati