ArrayList состоит из различных типов объектов - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть класс, который должен возвращать несколько объектов данных различных типов, таких как ArrayList<Integer> и массивы double[].Поскольку Java позволяет только одному объекту быть возвращенным данным методом, я пытаюсь связать различные объекты данных в ArrayList .Однако есть две проблемы:

  1. Код, который я придумываю, не может прочитать тип объекта в каждом индексе ArrayList.
    В частности, в ListOfObjects.java ниже, Eclipse выдает мне сообщение об ошибке с указанием Type mismatch: cannot convert from Object to ArrayList<Integer> в строке myAL1=dataHolder.get(0);, за которым следуют аналогичные сообщения об ошибках для трех других операторов get, следующих за ним.

  2. Я не знаю, какой тип указывать в качестве типа данных для ArrayList .

Мой код находится в двух файлах ниже.
Может кто-нибудь показатьмне, как это исправить, чтобы эти две проблемы были исправлены?

Мне нужно иметь возможность впоследствии использовать myAL1 в качестве ArrayList и использовать myDBL1 , mtDBL2 и myDBL3 as double [] .

ListOfObjects.java

import java.util.ArrayList;

public class ListOfObjects {
    ArrayList<Integer> myAL1 = new ArrayList<Integer>();
    double[] myDBL1 = new double[25];
    double[] myDBL2 = new double[25];
    double[] myDBL3 = new double[25];

    public static void main(String[] args) {
    }

    public void myMethod() {
        AssembleListOfObjects myLOO = new AssembleListOfObjects();
        ArrayList dataHolder = myLOO.buildListOfObjects();
        myAL1 = dataHolder.get(0);
        myDBL1 = dataHolder.get(0);
        myDBL2 = dataHolder.get(0);
        myDBL3 = dataHolder.get(0);
    }
}

AssembleListOfObjects.java

import java.util.ArrayList;

public class AssembleListOfObjects {
    ArrayList<Integer> al1 = new ArrayList<Integer>();
    double[] dbl1 = new double[25];
    double[] dbl2 = new double[25];
    double[] dbl3 = new double[25];

    public void main(String[] args) {
        buildListOfObjects();
    }

    public ArrayList buildListOfObjects() {
        ArrayList ListOfObjects = new ArrayList();
        ListOfObjects.add(al1);
        ListOfObjects.add(dbl1);
        ListOfObjects.add(dbl2);
        ListOfObjects.add(dbl3);
        return ListOfObjects;
    }
}

РЕДАКТИРОВАТЬ:

Я переписал это по-вашему, и вот что у меня есть до сих пор,Он выдает ошибку java.lang.NoSuchMethodError: main, если я не добавлю модификатор static в коде повсюду.
Когда я добавлю модификатор static везде, он выводит массивы нулей и пустой массив.
Как бы вы исправили этот код, чтобы ListOfObjects мог выводить значения для каждого из массивов / массивов?

Но вот код:

ListOfObjects.java

import java.util.ArrayList;

public class ListOfObjects {
    ArrayList<Integer> myAL1 = new ArrayList<Integer>();
    double[] myDBL1 = new double[25];
    double[] myDBL2 = new double[25];
    double[] myDBL3 = new double[25];

    public void main(String[] args) {
        myMethod();
    }

    public void myMethod() {
        AssembleListOfObjects myLOO = new AssembleListOfObjects();
        myAL1 = myLOO.getAl1();
        myDBL1 = myLOO.getDbl1();
        myDBL2 = myLOO.getDbl2();
        myDBL3 = myLOO.getDbl3();

        System.out.print("myAL1 is: (");
        for (int l = 0; l < myAL1.size(); l++) {
            if (l == 0) {
                System.out.print(myAL1.get(l));
            } else {
                System.out.print(", " + myAL1.get(l));
            }
        }
        System.out.println(")");

        System.out.print("myDBL1 is: (");
        for (int l = 0; l < myDBL1.length; l++) {
            if (l == 0) {
                System.out.print(myDBL1[l]);
            } else {
                System.out.print(", " + myDBL1[l]);
            }
        }
        System.out.println(")");

        System.out.print("myDBL2 is: (");
        for (int l = 0; l < myDBL2.length; l++) {
            if (l == 0) {
                System.out.print(myDBL2[l]);
            } else {
                System.out.print(", " + myDBL2[l]);
            }
        }
        System.out.println(")");

        System.out.print("myDBL3 is: (");
        for (int l = 0; l < myDBL3.length; l++) {
            if (l == 0) {
                System.out.print(myDBL3[l]);
            } else {
                System.out.print(", " + myDBL3[l]);
            }
        }
        System.out.println(")");
    }
}

AssembleListOfObjects.java

import java.util.ArrayList;

public class AssembleListOfObjects {
    private ArrayList<Integer> al1 = new ArrayList<Integer>();
    int mySize = 25;
    private double[] dbl1 = new double[mySize];
    private double[] dbl2 = new double[mySize];
    private double[] dbl3 = new double[mySize];

    public void main(String[] args) {
        setterMethod();
        getAl1();
        getDbl1();
        getDbl2();
        getDbl3();
    }

    public void setterMethod() {
        for (int j = 0; j < mySize; j++) {
            // the following lines are placeholders for a complex algorithm
            dbl1[j] = j;
            dbl2[j] = Math.pow((double) j, 3);
            dbl3[j] = Math.cos((double) j);
            if ((j % 3) == 0) {
                al1.add(j);
            }
        }
    }

    public ArrayList<Integer> getAl1() {
        return al1;
    }

    public double[] getDbl1() {
        return dbl1;
    }

    public double[] getDbl2() {
        return dbl2;
    }

    public double[] getDbl3() {
        return dbl3;
    }
}

Ответы [ 2 ]

5 голосов
/ 14 сентября 2011

Это очень плохое проектное решение, пытаться вернуть смешанные типы в списке массивов и предполагает, что ваш дизайн выключен.Если вы всегда манипулируете ArrayList из Integer и 3 двойных массивов, почему бы не поместить их в класс, здесь вы вызываете AssembleListOfObjects и даете этому классу публичные методы getter или accessor для получения ArrayList и для получения 3 двойных массивов по отдельности?Затем, если вам нужен метод для манипулирования этой информацией и ее возврата, он может просто вернуть объект этого класса, и тот, кто вызывает метод, может извлечь необходимую ему информацию, вызвав соответствующий метод получения.

например,

import java.util.ArrayList;

public class AssembleListOfObjects {
   private ArrayList<Integer> al1 = new ArrayList<Integer>();

   // Also this can be a 2-dimensional array of double
   private double[] dbl1 = new double[25];
   private double[] dbl2 = new double[25];
   private double[] dbl3 = new double[25];

   public ArrayList<Integer> getAl1() {
      return al1;
   }
   public double[] getDbl1() {
      return dbl1;
   }
   public double[] getDbl2() {
      return dbl2;
   }
   public double[] getDbl3() {
      return dbl3;
   }

   // public void setter methods
   // and any other data manipulation methods

}

Глядя на ваш недавно отредактированный код, я несколько изменил его, включая добавление статического модификатора к вашему методу main, чтобы он был методом try main, и вызов myMethod внутри нового объекта ListOfObjects, поскольку myMethod нельзявызывается в статическом контексте, но должен вызываться из соответствующего объекта.Я также позвонил на myLOO.setterMethod(); из моего метода:

import java.util.ArrayList;

public class ListOfObjects {
   ArrayList<Integer> myAL1 = new ArrayList<Integer>();
   double[] myDBL1 = new double[25];
   double[] myDBL2 = new double[25];
   double[] myDBL3 = new double[25];

   // added static to main method
   public static void main(String[] args) {
      // commented out as this can't be called in a static context, but 
      // needs to be called on an object
      // myMethod(); 


      // created a ListOfObjects object and called myMethod on it
      ListOfObjects myListOfObjs = new ListOfObjects();
      myListOfObjs.myMethod();
   }

   public void myMethod() {
      AssembleListOfObjects myLOO = new AssembleListOfObjects();
      myLOO.setterMethod();  // *** added
      myAL1 = myLOO.getAl1();
      myDBL1 = myLOO.getDbl1();
      myDBL2 = myLOO.getDbl2();
      myDBL3 = myLOO.getDbl3();

      System.out.print("myAL1 is: (");
      for (int l = 0; l < myAL1.size(); l++) {
         if (l == 0) {
            System.out.print(myAL1.get(l));
         } else {
            System.out.print(", " + myAL1.get(l));
         }
      }

      System.out.println(")");

      System.out.print("myDBL1 is: (");
      for (int l = 0; l < myDBL1.length; l++) {
         if (l == 0) {
            System.out.print(myDBL1[l]);
         } else {
            System.out.print(", " + myDBL1[l]);
         }
      }

      System.out.println(")");

      System.out.print("myDBL2 is: (");
      for (int l = 0; l < myDBL2.length; l++) {
         if (l == 0) {
            System.out.print(myDBL2[l]);
         } else {
            System.out.print(", " + myDBL2[l]);
         }
      }

      System.out.println(")");

      System.out.print("myDBL3 is: (");
      for (int l = 0; l < myDBL3.length; l++) {
         if (l == 0) {
            System.out.print(myDBL3[l]);
         } else {
            System.out.print(", " + myDBL3[l]);
         }
      }
      ;
      System.out.println(")");

   }
}

class AssembleListOfObjects {
   private ArrayList<Integer> al1 = new ArrayList<Integer>();
   int mySize = 25;
   private double[] dbl1 = new double[mySize];
   private double[] dbl2 = new double[mySize];
   private double[] dbl3 = new double[mySize];

   public void main(String[] args) {
      setterMethod();
      getAl1();
      getDbl1();
      getDbl2();
      getDbl3();
   }

   public void setterMethod() {
      for (int j = 0; j < mySize; j++) {
         // the following lines are placeholders for a complex algorithm
         dbl1[j] = j;
         dbl2[j] = Math.pow((double) j, 3);
         dbl3[j] = Math.cos((double) j);
         if ((j % 3) == 0) {
            al1.add(j);
         }
      }
   }

   public ArrayList<Integer> getAl1() {
      return al1;
   }

   public double[] getDbl1() {
      return dbl1;
   }

   public double[] getDbl2() {
      return dbl2;
   }

   public double[] getDbl3() {
      return dbl3;
   }
}
3 голосов
/ 14 сентября 2011

Чтобы обойти ошибки компилятора, используйте явные приведения, например:как то так.

...