2012-03-05 2 views
1

Я не вижу, чтобы получить двойной булевский массив, чтобы перейти к другому действию. Я использую putExtra, и когда я его извлекаю и отбрасываю до boolean[][], он заявляет, что он не может выполнять броски и сбои. Boolean [] работает.Как передать двойной массив (boolean [] []) между действиями?

Как бы я проехал boolean[][] между мероприятиями?

+0

Вы знаете точные размеры вашего 2-мерного булева? –

+0

Да, в этом случае это матрица 3x3, но в будущем я бы хотел, чтобы она была динамичной. – SolidSnake4444

ответ

3

Если вы абсолютно необходимо логическое значение [] [] (и не может сделать это только с плоским булевой [] массив передается Parcel.writeBooleanArray()), то формальный способ сделать это состоит в оберните его в класс Parcelable и выполните сортировку/разборку.

Я нарисую код, хотя это не проверено, поэтому, безусловно, есть некоторые проблемы.

public class BooleanArrayArray implements Parcelable { 
    private final boolean[][] mArray; 

    public BooleanArrayArray(boolean[][] array) { 
     mArray = array; 
    } 

    private BooleanArrayArray(Parcelable in) { 
     boolean[][] array; 
     final int N = in.readInt(); 
     array = new boolean[][N]; 
     for (int i=0; i<N; i++) { 
      array[i] = in.createBooleanArray(); 
     } 
     mArray = array; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     final int N = mArray.length; 
     out.writeInt(N); 
     for (int i=0; i<N; i++) { 
      out.writeBooleanArray(mArray[i]); 
     } 
    } 

    public static final Parcelable.Creator<BooleanArrayArray> CREATOR 
      = new Parcelable.Creator<BooleanArrayArray>() { 
     public BooleanArrayArraycreateFromParcel(Parcel in) { 
      return new BooleanArrayArray(in); 
     } 

     public BooleanArrayArray[] newArray(int size) { 
      return new BooleanArrayArray[size]; 
     } 
    }; 
} 
+0

Я вышел, поэтому у меня не было возможности попробовать это, но я собираюсь дать этот снимок, поскольку это, кажется, лучший метод для меня, поскольку мне, скорее всего, понадобится двумерный массив. Если я столкнулся с проблемами, я попрошу, и если это сработает, я дам вам знать и принять. – SolidSnake4444

+0

Я не смог проверить это, поскольку потерял программу. Однако, просматривая код, похоже, что это сработает. Я принимаю это как ответ. – SolidSnake4444

-1

Сделайте один публичный статический метод в вашем одном действии, который возвращает логическое [] []. Вы можете получить доступ к этому методу из любого другого вида деятельности/класса через весь проект. см. Следующий пример.

public class myActivity extends Activity 
{ 

    private static boolean[][] myBooleanVar; 
    .... 
    .... 
    .... 

    public static boolean[][] getBooleanArray() 
    { 
     return myBooleanVar; 
    } 
} 
+0

Я думаю, что лучше использовать экземпляр приложения для хранения переменной или, возможно, сингла. С другой стороны, я не уверен, что вы можете выставить эту переменную через статический метод, так как переменная нестатическая. –

+0

извините, это была ошибка кода, см. Обновленный код. – Android

+2

Вам не следует использовать ни одно из этих предложений, так как вы потеряете эти данные в любой момент, когда ваш процесс будет убит. – hackbod

1

Если вы действительно требуют 2-мерный массив, вы можете легко преобразовать 2-мерный массив в одномерный массив для передачи между процессами следующим образом:

public boolean[] toOneDimension(boolean[][] input){ 
    boolean[] output = new boolean[input.length * input[0].length]; 

    for(int i = 0; i < input.length; i++){ 
     for(int j = 0; j < input[i].length; j++){ 
      output[i*j] = input[i][j]; 
     } 
    } 

    return output; 
} 

, которые вы можете построить обратно в 2-мерный массив, как так:

public boolean[][] toTwoDimensions(int dimensions, boolean[] input){ 

    boolean[][] output = new boolean[input.length/dimensions][dimensions]; 

    for(int i = 0; i < input.length; i++){ 
     output[i/dimensions][i % dimensions] = input[i]; 
    } 

    return output; 
} 

затем использовать так:

public static void main(String[] args){ 
    int size = 10; 

    Random rand = new Random(); 
    Tester tester = new Tester(); //example code holder 
    boolean[][] value = new boolean[size+1][size]; 

    for(int i = 0; i < size+1; i++){ 
     for(int j = 0; j < size; j++){ 
      value[i][j] = rand.nextBoolean(); 
     } 
    } 


    boolean [][] output = tester.toTwoDimensions(size, tester.toOneDimension(value)); 

    for(int i = 0; i < size+1; i++){ 
     for(int j = 0; j < size; j++){ 
      assert value[i][j] == output[i][j]; 
     } 
    } 


} 

Единственное требование состоит в том, чтобы вам нужно было знать размер вашего массива, прежде чем вы его сплющили.

0

Это старый, но мне очень помог, поэтому я хотел поделиться своими выводами. Я использовал Parcelabler, чтобы сделать свой класс объектов доступным (потому что все, что я читал, было написано марсианским для меня), тогда я использовал @John Ericksen ответ, чтобы реализовать его в своем классе объектов и некоторые способы облегчить мою жизнь flattenMultiDimensionalArray и restoreMultiDimensionalArray и конечный результат.

Для 2 одномерного массива

MultiDimensionalArray .Java

public class MultiDimensionalArray implements Parcelable { 

private int[][] multiDimensionalArray; 
//Any other Variables, Objects 

public MultiDimensionalArray() { 

} 

public MultiDimensionalArray(int[][] multiDimensionalArray) { 

    this.multiDimensionalArray = multiDimensionalArray; 
    //Any other Variables, Objects 
} 

public int[][] getMultiDimensionalArray() { 

    return multiDimensionalArray; 
} 

public void setMultiDimensionalArray(int[][] multiDimensionalArray) { 

    this.multiDimensionalArray = multiDimensionalArray; 
} 

protected MultiDimensionalArray(Parcel in) { 

    int rows = in.readInt(); 
    int columns = in.readInt(); 
    int[] transitionalArray = in.createIntArray(); 
    multiDimensionalArray = restoreMultiDimensionalArray(transitionalArray, rows, columns); 
    //Any other Variables, Objects 

} 

@Override 
public int describeContents() { 

    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 

    int rows = multiDimensionalArray.length; 
    int columns = multiDimensionalArray[rows - 1].length; 
    int[] transitionalArray = flattenMultiDimensionalArray(multiDimensionalArray); 
    dest.writeInt(rows); 
    dest.writeInt(columns); 
    dest.writeIntArray(transitionalArray); 
    //Any other Variables, Objects 

} 
public static final Creator<MultiDimensionalArray> CREATOR = new Creator<MultiDimensionalArray>() { 

    @Override 
    public MultiDimensionalArray createFromParcel(Parcel in) { 

     return new MultiDimensionalArray(in); 
    } 

    @Override 
    public MultiDimensionalArray[] newArray(int size) { 

     return new MultiDimensionalArray[size]; 
    } 
}; 
private int[] flattenMultiDimensionalArray(int[][] sourceCard) { 

    int k = 0; 
    int[] targetCard = new int[sourceCard.length * sourceCard[sourceCard.length - 1].length]; 
    for (int[] aSourceCard : sourceCard) { 
     for (int anASourceCard : aSourceCard) { 
      targetCard[k] = anASourceCard; 
      k++; 
     } 
    } 
    return targetCard; 
} 
private int[][] restoreMultiDimensionalArray(int[] sourceCard, int rows, int columns) { 

    int k = 0; 
    int[][] multiDimensionalArray = new int[rows][columns]; 
    for (int i = 0; i < multiDimensionalArray.length; i++) { 
     for (int j = 0; j < multiDimensionalArray[multiDimensionalArray.length - 1].length; j++) { 
      multiDimensionalArray[i][j] = sourceCard[k]; 
      k++; 
     } 
    } 
    return multiDimensionalArray; 
} 

}

Смежные вопросы