2015-03-11 4 views
-1

Я работаю над проектом, который работает с большим количеством целых чисел, я решил использовать ArrayList < ArrayList < Целые числа >> называемые ALL_PIXELS. У меня возникли проблемы с получением моих значений в моем массиве или Arraylists, чтобы быть уникальным. Когда я проверяю код с некоторым базовым тестом в цикле for, все в порядке, один раз из цикла for все значения вспомогательного массива одинаковы, чего им не должно быть. вот какой-то код, который у меня есть, может быть, кто-то может мне помочь. Я проделал много испытаний с помощью системных инструкций. Выполнил их и прокомментировал их. Я обнаружил, что проблема заключается в том, что мой массив ArrayList ALL_PIXELS выглядит нормально внутри цикла for, но после цикла for все его подмассивы являются такими же, что и проблема.Java ArrayList of ArrayList целых чисел не работает правильно

package rmi.client; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.image.ImageProducer; 
import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.util.ArrayList; 
import java.util.HashMap; 

import rmi.Compute; 
import rmi.RmiStarter; 

public class StartComputeTaskMan extends RmiStarter { 

// things for the Panel that i can't extend 

private static JPanel mainPanel = new JPanel(); // this is what I'll add tocontentPane            
private static JPanel panel = new JPanel(); 
private JComponent[] allComponents = { panel }; 

final static int FRAME_WIDTH = 2000; 
final static int FRAME_HEIGHT = 1500; 
final static int MAX_ITERATION = 1000; 
final static double ZOOM_FACTOR = 5; 

final static double X_LEFT_BOUND = -2.5; 
final static double X_RIGHT_BOUND = 1.5; 
final static double Y_TOP_BOUND = 1.5; 
final static double Y_BOTTOM_BOUND = -1.5; 

final static BufferedImage IMAGE = new BufferedImage(FRAME_WIDTH,FRAME_HEIGHT, BufferedImage.TYPE_INT_RGB); 
final static int[] COLORS = new int[MAX_ITERATION]; 
final static ArrayList<ArrayList<Integer>> ALL_PIXELS = new ArrayList<ArrayList<Integer>>(); 
ArrayList<HashMap<String, Double>> boundsHistory = new ArrayList<HashMap<String, Double>>(); 
int zoomNum = 0; 

// end of global variables 

// constructor 
public StartComputeTaskMan() { 
    super(PI.class); 


    for (JComponent comp : allComponents) { 
     mainPanel.add(comp); 
    }// end for loop 

    HashMap<String, Double> map = new HashMap<String, Double>(); 
    map.put("left", X_LEFT_BOUND); 
    map.put("right", X_RIGHT_BOUND); 
    map.put("top", Y_TOP_BOUND); 
    map.put("bottom", Y_BOTTOM_BOUND); 
    boundsHistory.add(map); 

    for (int i = 0; i < MAX_ITERATION; i++) { 
     COLORS[i] = Color.HSBtoRGB(i/256f, 1, i/(i + 8f)); 
    }// end for loop 
}// end constructor 

public static JComponent getMainComponent() { 
    return mainPanel; 
}// end JComponent 

private static void createAndShowGui() { 

    // creating my JFrame only when I need it and where I need it 
    JFrame frame = new JFrame("Mandelbrotset"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(getMainComponent()); 
    frame.pack(); 
    frame.setLocationByPlatform(true); 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setVisible(true); 
    panel.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    panel.setVisible(true); 
    frame.add(panel); 
} 

@Override 
public void doCustomRmiHandling() { 
    try { 
     System.setProperty("java.rmi.server.hostname", "172.31.98.63"); 
     System.out.println("Getting Registry"); 
     Registry registry = LocateRegistry.getRegistry("172.31.98.63"); 
     System.out.println("Getting Compute"); 
     try { 
      Compute<Integer> compute = (Compute<Integer>) registry.lookup(Compute.SERVICE_NAME);    
     } catch (NotBoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
}//end doCustomRmiHandling 

public void doTask() { 
    System.out.println("Getting Task"); 


    //why is this not making ALL_PIXELS unique for each row ............. 

    for (int i = 0; i < FRAME_HEIGHT; i++) { 

     HashMap<String, Double> t = boundsHistory.get(zoomNum); 
     PI task = new PI(i, t); 
     //this is the problem. some where 
     ArrayList<Integer> temp = new ArrayList<Integer>(); 
     temp = task.execute(); 
     //System.out.println(temp); 
     ALL_PIXELS.add(temp); 
     //System.out.println(ALL_PIXELS.get(i));  //still unique here....WHYYYYYYY 
     //System.out.println(temp);  //this shows that temp is a unique array each row 

    }// end for loop  



    //why is all pixels seting the same vales to all of its sub arrays 
    //System.out.println(ALL_PIXELS.get(3)); 
    //System.out.println(ALL_PIXELS.get(300)); 


    System.out.println("Computing"); 




}// end doTask 



public double getScaledX(int x) { 
    double returnValue = ((double) x/(double) FRAME_WIDTH)* (boundsHistory.get(zoomNum).get("right") 
      - boundsHistory.get(zoomNum).get("left"))+ boundsHistory.get(zoomNum).get("left");  
    return returnValue; 
}// end getscaledX 

public double getScaledY(int y) { 
    double returnValue = ((double) y/(double) FRAME_HEIGHT)* -(boundsHistory.get(zoomNum).get("top") 
      - boundsHistory.get(zoomNum).get("bottom")) + boundsHistory.get(zoomNum).get("top");  
    return returnValue; 
}// end getscaledY 

public static void main(String[] args) { 
    createAndShowGui();//makes our GUI 
    StartComputeTaskMan test = new StartComputeTaskMan(); 
    test.doTask();//fills in ALLPIXELS 

    //all of sub arrays are the same in all pixels 



    //makeImage(test);//makes the buffered image 
    //paintComponent(null); 

}// end main 

private static void makeImage(StartComputeTaskMan test) { 
    for(int j=0; j<FRAME_HEIGHT;j++){ 
     for(int i=0;i<FRAME_WIDTH;i++){ 
      if(ALL_PIXELS.get(j).get(i)<MAX_ITERATION){ 
       IMAGE.setRGB(j,i,COLORS[ALL_PIXELS.get(j).get(i)-1]); 
      }else{ 
       IMAGE.setRGB(j,i,0); 

      } 


     }//end nested for loop 
    }//end for loop 
}//end makeImage 



private static void paintComponent(Graphics g){ 
    g.drawImage(IMAGE, 0, 0, FRAME_WIDTH, FRAME_HEIGHT,null); 
} 
}// end class 

Это мой основной код. Второй метод, который у меня есть, - это. все это имеет около 7 других классов, которые делают RMI возможным. но те, которые не нужны для этой проблемы, что я с

package rmi.client; 
                  //rmi client 
import java.awt.image.BufferedImage; 
import java.io.Serializable; 
import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.HashMap; 


import rmi.Task; 

public class PI implements Task<BigDecimal>, Serializable { 

    private static final long serialVersionUID = 3942967283733335029L; 

    final static int FRAME_WIDTH = 2000; 
    final static int FRAME_HEIGHT = 1500; 
    final static int MAX_ITERATION = 1000; 
    final static double ZOOM_FACTOR = 5; 

    final static double X_LEFT_BOUND = -2.5; 
    final static double X_RIGHT_BOUND = 1.5; 
    final static double Y_TOP_BOUND = 1.5; 
    final static double Y_BOTTOM_BOUND = -1.5; 

    final static BufferedImage IMAGE = new BufferedImage(FRAME_WIDTH, FRAME_HEIGHT, BufferedImage.TYPE_INT_RGB); 
    final static int[] COLORS = new int[MAX_ITERATION]; 
    //final static ArrayList<ArrayList<Integer>> ALL_PIXELS = new ArrayList<ArrayList<Integer>>(FRAME_HEIGHT); 
    static ArrayList<HashMap<String, Double>> boundsHistory = new ArrayList<HashMap<String, Double>>(); 
    int zoomNum = 0; 

    static ArrayList<Integer> rowList = new ArrayList<Integer>(); 

    static double scaledRow; 
    static int row; 
    static int frame_width = FRAME_HEIGHT; 
    static int frame_height; 
    static int max_iteration; 
    static int[] colors; 
    static HashMap<String, Double> bounds; 
    static BufferedImage image; 




public PI(int row, HashMap<String,Double> bounds){ 
     rowList.clear();//just to be safe 
     this.row = row; 
     this.bounds = bounds; 
     scaledRow = getScaledY(row); 

     frame_width = FRAME_WIDTH; 
     frame_height = FRAME_HEIGHT; 
     max_iteration = MAX_ITERATION; 
     image = IMAGE; 
     colors = COLORS; 
    } 

    /** 
    * sending arrays to the rmi base and then to the server 
    */ 
    public ArrayList<Integer> execute() { 

     rowList = computePi(row); 
     //System.out.println(rowList); 
     return rowList; 
    } 
    //this is what is doing the work 
    public static ArrayList<Integer> computePi(int row) { 



     for(int column = 0; column<frame_width; column++){ 
      double x0 = getScaledX(column); 
      double y0 = getScaledY(row); 
      double x = 0.0; 
      double y = 0.0; 
      int iteration = 0; 

      while((x*x + y*y < 2*2) && iteration <max_iteration){ 
       double xtemp = x*x - y*y + x0; 
       y = 2*x*y + y0; 
       x = xtemp; 
       iteration++; 
       } 
    //System.out.println("row number "+row + ": column number " + column+ ": " + " iterations "+iteration); 
       if(iteration < max_iteration){ 

        //image.setRGB(column,row,colors[iteration-1]); 
        rowList.add(iteration-1); 
        } else{ 
         //image.setRGB(column,row,0); 
        rowList.add(0); 
        } 
      } 
     return rowList; 

    }//end compute pi 

     //MandelbrotSet2.ALL_PIXELS.add(row, rowList); 

     public static double getScaledX(int x){ 
      double returnValue = ((double)x/(double)frame_width)*(bounds.get("right") - bounds.get("left")) + bounds.get("left"); 
      return returnValue; 
     } 

     public static double getScaledY(int y){ 
      double returnValue = ((double)y/(double)frame_height)*-(bounds.get("top") - bounds.get("bottom")) + bounds.get("top"); 
      return returnValue; 
     } 

     public void run() { 
      computePi(row); 
     } 



    } 

Опять какие-либо советы о том, почему ALL_PIXELS не является уникальным вне для цикла было бы хорошо. Я попытался отладить его, и я не мог найти, почему у меня проблема.

+0

Просьба привести полный пример проблемы. Я не знаю, что такое тип 'boundsHistory' и не знаю, как выглядит класс, определяющий' PI'. Я предлагаю вам попробовать и вытащить все постороннее и включить полный контекст в ваш вопрос. –

+0

Спасибо за совет, я пошел и отредактировал вышеупомянутое сообщение. также благодарю вас за ваше время – DramaCop

+0

Любые причины, по которым вы предпочитаете архариста над связаннымhashmap? – Olu

ответ

0

Попробуйте изменить следующие строки:

ArrayList<Integer> temp = new ArrayList<Integer>(); 
    temp = task.execute(); 
    //System.out.println(temp); 
    ALL_PIXELS.add(temp); 

к:

ArrayList<Integer> temp = null; 
    temp = task.execute(); 
    //System.out.println(temp); 
    ALL_PIXELS.add(new ArrayList<Integer>(temp)); 

В качестве способа выполнения класса ПИ делает вызов ComputePi() метод, который модифицирующая ссылку ArrayList, который йо добавлен в список ALL_PIXELS. Таким образом, одна и та же ссылка меняется каждый раз. Итак, в то время, когда вы добавляете его в список ALL_PIXELS, убедитесь, что у вас есть новая ссылка на список.

+0

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

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