[Java]如何将ArrayList中的对象设置为不同类型的变量?

时间:2016-12-04 04:14:42

标签: java arraylist

我有一个用字符串,双打和布尔值填充的对象数组列表。

     ArrayList<Object> nlist = new ArrayList<>();
     nlist.add(n.getUserName());//USerName is a string
     nlist.add(n.getWallet());// Wallet is a Double
     nlist.add(n.getAmountOfStorage());// Double
     nlist.add(n.isLoyal());// bool
     nlist.add(n.isPayAhead());// bool
     nlist.add(n.isRegular());//bool

此arraylist已序列化为.obj文件。我想阅读arraylist并将其设置为变量列表。我试过这样的事但没有运气。

      try {
        ObjectInputStream filein = new ObjectInputStream(new BufferedInputStream(new FileInputStream(mainFile)));
        Object inObj = filein.readObject();
        if (inObj instanceof ArrayList) {
        int i = 0;
        ArrayList<Object> rlist = (ArrayList)inObj; //Arraylist of objects to set Variables to.
//tried this.
        n.setUserName(rlist.get(i));
        i++;
        n.setWallet(rlist.get(i));
        //continuing for a few more variables.

获取设置为不同类型变量的对象列表的最佳方法是什么?

4 个答案:

答案 0 :(得分:0)

我认为你不能做到这一点。你要做的唯一方法是将每个值设置为适当的类型。没有办法(我知道)如果它不知道它所包含的类型,你可以为数组列表类型分配一个变量。希望这会有所帮助:)

答案 1 :(得分:0)

您应该创建一个包含所需的所有变量作为字段的类,而不是ArrayList。

然后将其写入流中。

也许像

public class Customer implements Serializable {
    String userName;
    Double wallet;
    Double amountOfStorage;
    boolean isLoyal;
    boolean isPayAhead;
    boolean isRegular;
}

如果您发现自己正在考虑创建一个容器(List),其中包含与继承无关的各种不同类型(除了Object),那么您可能会走错路。

答案 2 :(得分:0)

从未听说过POJO(Plain Old Java Object)?

您可以使用此普通旧Java对象将不同类型的Object存储在一个Object中,然后它将是您ArrayList的类型。就像这样:

public class NameOfObjectYouWant {
     String userName;
     Double wallet;
     Double amountOfStorage;
     Boolean isLoyal;
     Boolean isPayAhead;
     Boolean isRegular;

     // Getters and Setters Method....
}

您将在此类名为POJO的对象中设置您想要的值,然后将其添加到ArrayList

ArrayList<NameOfObjectYouWant> arrayList = new ArrayList<>();
NameOfObjectYouWant n = new NameOfObjectYouWant();
n.setUserName("userName"); // Sample Inputs...
n.setWallet(232.42);
n.setAmountStorage(3000.00);
n.isLoyal(true);
n.isPayHead(true);
n.isRegular(true);
arrayList.add(n); // Add your n in your ArrayList..

答案 3 :(得分:0)

ArrayList&lt; Object&gt;数组基本上可以容纳任何对象,String,Integers,Longs,JButton等等。现在我不太确定这是否是您正在寻找的但是我要给它一个射击。如果您想知道特定ArrayList中包含的对象&lt; Object&gt;然后你可以使用一个简单的方法,如下所示:

public static String varType(final Object objectVar) {
    try {
      return objectVar.getClass().getSimpleName().toUpperCase();
    }
    catch (Exception e) { return null; }
}

如何使用此方法:

JButton myButton = new JButton();
JTextField myTextField = new JTextField();
JFrame myFrame = new JFrame();

ArrayList<Object> a = new ArrayList<>();
a.add("My String");
a.add(23234);
a.add(376754356L);
a.add(345.74678D);
a.add(3.54f);
a.add(true);
a.add('A');
a.add(myButton);
a.add(myTextField);
a.add(myFrame);

for (int i = 0; i < a.size(); i++) {
    System.out.println("Element at index " + i + " contains a " + 
                varType(a.get(i)) + " Object.");
}

当然,要将Object ArrayList(默认情况下为Object)的元素放入各自的变量中,您需要将它们强制转换为它,例如:

JButton myButton = new JButton();
JTextField myTextField = new JTextField();
JFrame myFrame = new JFrame();

ArrayList<Object> a = new ArrayList<>();
a.add("My String");
a.add(23234);
a.add(376754356L);
a.add(345.74678D);
a.add(3.54f);
a.add(true);
a.add('A');
a.add(myButton);
a.add(myTextField);
a.add(myFrame);

//Ten elements within the Object ArrayList (0-9)
String myString = a.get(0).toString();
int myInt = (int) a.get(1);
long myLong = (long) a.get(2);
double myDouble = (double) a.get(3);
float myFloat = (float) a.get(4);
boolean myBoolean = (boolean) a.get(5);
char myChar = (char) a.get(6);
JButton myNewButton = (JButton) a.get(7);
JTextField myNewTextField = (JTextField) a.get(8);
JFrame myNewFrame = (JFrame) a.get(9);

System.out.println(varType(myString));
System.out.println(varType(myInt));
System.out.println(varType(myLong));
System.out.println(varType(myDouble));
System.out.println(varType(myFloat));
System.out.println(varType(myBoolean));
System.out.println(varType(myChar));
System.out.println(varType(myNewButton));
System.out.println(varType(myNewTextField));
System.out.println(varType(myNewFrame));