【问题标题】:Java ArrayList contents not propagatingJava ArrayList 内容未传播
【发布时间】:2011-11-13 10:56:58
【问题描述】:

我的代码在数组上运行算法,并将结果存储在 ArrayList 中。问题是我无法访问 ArrayList 的内容以进行后续处理。尽管我的实际代码长达数千行,但我已经解决了这个问题,并在下面的短代码段中重新创建了这个问题。您可以学习下面的三个类并在您的 IDE 中运行它们而无需更改以自己重现问题。如您所见,它填充了 makeArrayList.java 中的 ArrayList,但是 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());}}

【问题讨论】:

  • 谢谢。仅仅捕获错误然后重现它就花了很长时间。
  • 我能够使用该解决方案来解决我的代码中的问题。因此,我现在将此问题标记为已回答。

标签: java arrays class arraylist propagation


【解决方案1】:

你混淆了继承和组合在同一个类中:

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 并且您试图使两个 ArrayLists 可互换,但它们不是。

一些建议:

  • 这个类不需要扩展 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);
   }
}

【讨论】:

  • 非常感谢。我删除了 ArrayList 的扩展名,但它现在给出以下错误:“线程“main”java.lang.Error 中的异常:未解决的编译问题:类型不匹配:无法在 arrayListPractice 从 makeArrayList 转换为 ArrayList。 getArrayList.getPeaks(getArrayList.java:11)".
  • 是的,因为它没有扩展数组列表,所以当然你必须改变你的代码。想一想,你就会明白的。
  • 谢谢。我尝试了您的建议,并且 Eclipse 给出了错误:“类型不匹配:无法从 makeArrayList 转换为 ArrayList”的行:“PeakList = new MakeArrayList2(myArray, myLength).getArrayList();”在您的 GetArrayList2 中。
  • 我会不断地阅读和学习。这个问题激励我开始对你提到的主题进行另一次广泛的探索。但是我已经解决这个问题几天了,如果可能的话,我希望能从这个论坛上找到一个明确的答案。底层算法花了一个月的时间来编写,调试它需要我做更多的工作。如果有人愿意花几分钟为我节省这一步的几天时间,我不想等待一周开始调试底层算法。再次感谢您。
  • ???您对我的 cmets 和代码有什么不了解的地方?我至少在 40 多分钟前为您发布的代码编写了完整的代码解决方案,我不确定您还期望或需要什么?
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多