Javaアレイリストのコンテンツは伝播しません
-
28-10-2019 - |
質問
私のコードは、配列でアルゴリズムを実行し、結果を配列リストに保存します。問題は、後続の処理のためにアレイリストのコンテンツにアクセスできないことです。私の実際のコードは数千行の長さですが、私は問題を閉じ込め、以下の短いコードセグメントで問題を再作成しました。以下の3つのクラスを取り、問題を自分で再現するために変更せずにIDEでそれらを実行できます。ご覧のとおり、MakearRayList.java内のArrayListを入力しますが、ArrayListの内容はGetArrayList.javaでその後表示されません。
ArrayListの内容がgetArrayList.javaおよびmygui.javaで表示/使用可能になるように、以下のコードを修正する方法を誰かに教えてもらえますか?
3つのクラスのコードは次のとおりです。
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());}}
解決
あなたは同じクラスで継承と構成を混乱させ、組み合わせています:
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を交換可能にしようとしていますが、そうではありません。
いくつかの提案:
- このクラスがアレイリストを拡張する必要はないので、拡張機能を取り除き、代わりに構成を使用して単純化して明確にします。
- あなたがそうすることの非常に正当な理由がない限り、静的なものを使用しないでください。これは主な問題の一部ではありませんが、サンプルコードの問題です。
- 他の人があなたのコードを読んで、あなたを助けるか、あなたを採点するかのどちらかのために、あなたのコードをより読みやすくするためにWhitespaceを使用することを恐れないでください。ページの不動産はそれほど高価ではありません。また、クラス名の最初の文字を大文字にするなど、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);
}
}
所属していません StackOverflow