Содержимое Java ArrayList не распространяется - PullRequest
4 голосов
/ 09 сентября 2011

Мой код запускает алгоритм в массиве и сохраняет результаты в ArrayList. Проблема в том, что я не могу получить доступ к содержимому ArrayList для последующей обработки. Хотя мой настоящий код состоит из тысяч строк, я поймал проблему и заново создал проблему в следующих сегментах короткого кода. Вы можете взять три класса ниже и запустить их в своей IDE без изменений, чтобы воспроизвести проблему самостоятельно. Как вы можете видеть, он заполняет ArrayList в makeArrayList.java, но содержимое ArrayList впоследствии не отображается в getArrayList.java.

Может кто-нибудь показать мне, как исправить приведенный ниже код, чтобы содержимое ArrayList стало видимым / пригодным для использования в getArrayList.java и в myGUI.java?

Вот код для трех классов:

Код для myGUI.java:

package arrayListPractice;

import java.awt.Dimension;
import javax.swing.JFrame;

public class myGUI extends JFrame {
public myGUI() {
    super("test GUI");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setPreferredSize(new Dimension(300, 200));
    getArrayList getArrList = new getArrayList();
    getArrList.getPeaks();
    this.pack();}

public static void main(String args[]) {
    myGUI myFrame = new myGUI();
    myFrame.setVisible(true);}}

Код для getArrayList.java:

package arrayListPractice;
import java.util.*;

public class getArrayList {
public static ArrayList<Integer> PeakList;
int myLength = 3500;
double[] myArray=new double[myLength];

public ArrayList<Integer> getPeaks(){
    for(int h=0;h<myLength;h++){myArray[h]=Math.sqrt((double)h);}
    PeakList = new makeArrayList(myArray,myLength);
    System.out.println("in getArrayList.getPeaks, PeakList.size() is: "+PeakList.size());
    return PeakList;}}

Код для makeArrayList.java:

package arrayListPractice;

import java.util.*;

public class makeArrayList extends ArrayList<Integer> {
ArrayList<Integer> myArrayList= new ArrayList<Integer>();

public makeArrayList(double[] myArray, int arrayLength) {
    // NOTE: My actual code does many transformations to myArray.  The resulting myArrayList 
    // contains only 1/1000 of the points in myArray.  This code is just simplified for debugging.
    for(int i=0;i<arrayLength;i++){myArrayList.add((int)Math.pow(myArray[i],2));}
    System.out.println("in makeArrayList, PeakList.size() is: "+myArrayList.size());}}

1 Ответ

4 голосов
/ 09 сентября 2011

Вы путаете и комбинируете наследование и композицию в одном классе:

class makeArrayList extends ArrayList<Integer> {
   ArrayList<Integer> myArrayList = new ArrayList<Integer>();

   public makeArrayList(double[] myArray, int arrayLength) {
      // NOTE: My actual code does many transformations to myArray. The
      // resulting myArrayList
      // contains only 1/1000 of the points in myArray. This code is just
      // simplified for debugging.
      for (int i = 0; i < arrayLength; i++) {
         myArrayList.add((int) Math.pow(myArray[i], 2));
      }
      System.out.println("in makeArrayList, PeakList.size() is: "
            + myArrayList.size());
   }
}

Обратите внимание, что этот класс содержит ArrayList и расширяет ArrayList, и вы пытаетесь сделать оба ArrayList взаимозаменяемыми, но это не так.

Некоторые предложения:

  • Нет необходимости для этого класса расширять ArrayList, поэтому избавьтесь от расширений и вместо этого упростите и проясните ситуацию, просто используя состав.
  • Старайтесь не использовать что-либо статичное, если у вас нет для этого веских причин. Это не часть вашей основной проблемы, но проблема с вашим примером кода.
  • Для того, чтобы другие читали ваш код и помогали вам или оценивали вас, не бойтесь использовать пробелы, чтобы сделать ваш код более читабельным. Страница недвижимости не так уж и дорога. Также прочтите и используйте соглашения об именах Java, включая использование заглавных букв в именах классов. Это облегчит другим (нам!) Чтение и понимание вашего кода.

например.,

import java.util.ArrayList;

public class MyNonGUI2  {

   public static void main(String args[]) {
      GetArrayList2 getArrList = new GetArrayList2();
      getArrList.getPeaks();
   }
}

class GetArrayList2 {
   public ArrayList<Integer> PeakList;
   int myLength = 3500;
   double[] myArray = new double[myLength];

   public ArrayList<Integer> getPeaks() {
      for (int h = 0; h < myLength; h++) {
         myArray[h] = Math.sqrt((double) h);
      }
      PeakList = new MakeArrayList2(myArray, myLength).getArrayList();
      System.out.println("in GetArrayList2.getPeaks, PeakList.size() is: "
            + PeakList.size());
      return PeakList;
   }
}

class MakeArrayList2 {
   ArrayList<Integer> myArrayList = new ArrayList<Integer>();

   public MakeArrayList2(double[] myArray, int arrayLength) {
      for (int i = 0; i < arrayLength; i++) {
         myArrayList.add((int) Math.pow(myArray[i], 2));
      }
      System.out.println("in MakeArrayList2, PeakList.size() is: "
            + myArrayList.size());
   }

   public int size() {
      return myArrayList.size();
   }

   public ArrayList<Integer> getArrayList() {
      return new ArrayList<Integer>(myArrayList);
   }
}
...