2014-11-21 127 views
1

我想在空白空間中移動假元素(就像在Schelling的分離模型中一樣)。 這是陣列..(陣列中的元件被隨機放置)在二維數組中移動元素

'X' 'X' ' ' 'O' 'X' 
'X' ' ' 'X' ' ' 'O' 
'X' 'O' ' ' 'O' 'O' 
' ' 'O' ' ' ' ' ' ' 
' ' ' ' ' ' ' ' ' '  

在(0,4),(1,2),(2,1)(3,1)的元件,是錯誤的,因爲它周圍沒有類似的元素,或者周圍沒有足夠的單元格。 我想將這些錯誤元素移動到數組中的空白位置,並將這些錯誤的位置設爲空白。假元素可以移動到任何空位置陣列中,使它看起來像這樣

'X' 'X' 'X' 'O' ' ' 
'X' 'X' ' ' 'O' 'O' 
'X' ' ' 'O' 'O' 'O' 
' ' ' ' ' ' ' ' ' ' 
' ' ' ' ' ' ' ' ' ' 

這是我得到

'X' 'X' 'X' 'O' 'X' 
'X' 'X' 'X' 'X' 'O' 
'X' 'O' 'O' 'O' 'O' 
'O' 'O' 'O' 'O' 'O' 
'' '' '' '' '' 

這是我的代碼。

//isArrGood is a method that checks if the element is false or true 
//arr is 2D array that is being passed in the method 

    char[] falseCell = new char[arr.length * arr[0].length]; 

    for(int row=0; row<arr.length; row++){ 
     for(int col=0; col<arr[row].length; col++){ 
      if(!isArrGood(arr,row,col)){ 
       falseCell[row] = arr[row][col]; 
       arr[row][col] = ' '; 
       } 
      } 
     } 


    for(int i=0; i<arr.length; i++){ 
     for(int j=0; j<arr[0].length; j++){ 
      if(arr[i][j] == ' '){ 
       arr[i][j] = falseCell[i]; 
      } 
     } 
    } 

回答

1

你能發佈更多的代碼嗎,例如你的問題的最小,完整和可驗證的例子?

對於這個問題說明你可以使用代碼我寫了學習的榜樣:

import java.util.Random; 

public class ShellingSegregationModel 
{ 
    public static final int EMPTY = 0; 
    public static final int BLUE = 1; 
    public static final int RED = 2; 

    // number of elements for random 
    public static final int ELEMENTS = 3; 

    public static final double THRESHOLD = 0.15;   

    //size of the field 
    public int size; 

    int[][] field; 
    // temporary field for the iteration 
    int[][] temporary; 

    public int iteration; 

    public ShellingSegregationModel(int size) 
    {  
     Random random = new Random(); 
     this.size = size; 
     field  = new int[size][size]; 
     for (int y = 0; y < size; y++) 
     { 
      for (int x = 0; x < size; x++) 
      { 
       field[y][x] = random.nextInt(ELEMENTS); 
      } 
     } 
    } 

    public int getSize() 
    { 
     return size; 
    } 

    public void setField(int[][] field) 
    { 
     this.field = field; 
    } 

    public int[][] getField() 
    { 
     return field; 
    } 

    public void setTemporary(int[][] temporary) 
    { 
     this.temporary = temporary; 
    } 

    public int[][] getTemporary() 
    { 
     return temporary; 
    } 

    public int getIteration() 
    { 
     return iteration; 
    } 

    public void setIteration(int iteration) 
    { 
     this.iteration = iteration; 
    } 

    public double getThreshold() 
    { 
     return THRESHOLD; 
    } 

    //how many neighbors needed for threshold 
    public double getCalculatedThreshold() 
    { 
     return getThreshold()*8;//8 is the neighbors count total possible 
    } 

    public static String getSymbolFor(int x) 
    { 
     String s = ""; 
     switch (x) 
     {    
      case BLUE: 
       s = "x"; 
       break; 
      case RED : 
       s = "o"; 
       break; 
      case EMPTY: 
      default: 
       s = " ";     
     } 
     return s; 
    } 

    public boolean isEmpty(int x, int y) 
    { 
     return get(x,y) == EMPTY; 
    } 

    /** 
    * Prints field 
    */ 
    public void print(String message) 
    { 
     System.out.println(message); 
     for (int y = 0; y < getSize(); y++) 
     {   
      StringBuilder row = new StringBuilder(); 
      for (int x = 0; x < getSize(); x++) 
      {     
       row.append("'").append(getSymbolFor(get(x,y))).append("' "); 
      } 
      System.out.println(row.toString()); 
     } 
    } 

    public void printSameNeighorsCount(String message) 
    { 
     System.out.println(message); 
     for (int y = 0; y < getSize(); y++) 
     {   
      StringBuilder row = new StringBuilder(); 
      for (int x = 0; x < getSize(); x++) 
      {     
       row.append("'").append(sameNeighbors(x, y)).append("' "); 
      } 
      System.out.println(row.toString()); 
     } 
    } 

    public int get(int x, int y) 
    { 
     return getField()[y][x]; 
    } 

    private int add(boolean c) 
    { 
     return c ? 1 : 0; 
    } 

    public int sameNeighbors(int x, int y) 
    { 
     return isEmpty(x,y) ? 0 : 
        add(isSame(get(x,y),x ,y-1)) 
       + add(isSame(get(x,y),x-1,y-1)) 
       + add(isSame(get(x,y),x-1,y )) 
       + add(isSame(get(x,y),x-1,y+1)) 
       + add(isSame(get(x,y),x ,y+1)) 
       + add(isSame(get(x,y),x+1,y+1)) 
       + add(isSame(get(x,y),x+1,y )) 
       + add(isSame(get(x,y),x+1,y-1)); 
    }  

    private static void copyArray(int[][] src, int[][] dest) 
    {   
     for (int i = 0; i < src.length; i++) 
     { 
      dest[i] = new int[src[i].length]; 
      System.arraycopy(src[i], 0, dest[i], 0, src[i].length);    
     }     
    } 
    private void duplicateToTemporary() 
    { 
     setTemporary(new int[getField().length][]); 
     copyArray(getField(),getTemporary()); 
    } 

    // 
    private void assignFromTemporary() 
    { 
     setField(new int[getField().length][]); 
     copyArray(getTemporary(), getField()); 
    } 

    public void iterate(int iterations) 
    {   
     for (int i = 0; i < iterations; i++)   
     { 
      duplicateToTemporary(); 
      for (int y = 0; y < getSize(); y++) 
      { 
       for (int x = 0; x < getSize(); x++) 
       { 
        if (!isHappy(x,y)) 
        { 
         swap(x,y); 
        } 
       } 
      } 
      assignFromTemporary(); 
     } 
     setIteration(getIteration()+iterations); 
    } 

    //Swaps with empty random from temporary 
    public void swap(int i, int j) 
    { 
     Random random = new Random(); 
     boolean swapped = false; 
     while (!swapped) 
     { 
      for (int y = 0; !swapped && y < getSize(); y++) 
      { 
       for (int x = 0; !swapped && x < getSize(); x++) 
       { 
        //swap semi-randomly 
        if (getTemporary()[y][x] == EMPTY && random.nextBoolean()) 
        {       
         getTemporary()[y][x] = getTemporary()[j][i]; 
         getTemporary()[j][i] = EMPTY ; 
         swapped = true; 
        } 
       } 
      } 
     } 
    } 

    public boolean isHappy(int x, int y) 
    { 
     return getCalculatedThreshold() < sameNeighbors(x, y);   
    } 

    public boolean isSame(int me, int x, int y) 
    { 
     return 
       //check bounds 
       x >= 0 && y >= 0 && x < getSize() && y < getSize() 
       //check element 
       && get(x,y) == me; 
    } 

    public static void main(String[] args) 
    { 
     ShellingSegregationModel ssm = new ShellingSegregationModel(10); 
     ssm.print("Randomly generated field");  
     ssm.printSameNeighorsCount("Same neighbors count"); 
     ssm.iterate(5); 
     ssm.print("Field after 5 iterations");  
     ssm.printSameNeighorsCount("Same neighbors count"); 
     ssm.iterate(5); 
     ssm.print("Field after 10 iterations");  
     ssm.printSameNeighorsCount("Same neighbors count"); 
     ssm.iterate(5); 
     ssm.print("Field after 15 iterations");  
     ssm.printSameNeighorsCount("Same neighbors count"); 
     ssm.iterate(50); 
     ssm.print("Field after 65 iterations");  
     ssm.printSameNeighorsCount("Same neighbors count"); 
    } 
}