Java中的ArrayList和更原始的类型

时间:2014-04-25 13:12:57

标签: java vector arraylist primitive-types

我需要创建一个包含多个基本类型的Java数组列表(精确地说,一个向量)。 例如,我想在每个向量的行中看到这个:

row[0] --> "str1", 5, "str2", "str3", 3.5, 6, "str4"...etc...
row[1] --> "str5", 6, "str6", "str7", 5.3, 8, "str8"...etc...

你能帮助我吗?

谢谢! :)

5 个答案:

答案 0 :(得分:1)

您可以使用列表列表。如下所示

    Vector<Vector<Object>> list = new Vector<Vector<Object>>();
    Vector<Object> row1 = new Vector<Object>();
    row1.add(5);
    row1.add("John");

    Vector<Object> row2 = new Vector<Object>();
    row1.add(1.1);
    row1.add("Aby");

    list.add(row1);
    list.add(row2);

答案 1 :(得分:1)

Java泛型不能包含基本类型。您必须使用相应的对象类型。例如整数或浮点数。

要将多种类型的对象放入容器中,请将其声明为包含超类型:

Vector<Object> v = new Vector<Object>();
v.add("String");
v.add(new Integer(5));

请注意,当您执行v.get(0)时,您将收到Object类型的对象。你必须知道你想把它扔回去的类型。

要检查对象的运行时类型,可以使用Object.getClass(),或使用instanceof运算符将其与已知类型进行比较,如下所示:

if(object instanceof String){
    // do something with a String
}else{
    // do something with a Number (Integer etc.)
}

答案 2 :(得分:1)

在Java中以统一的方式存储混合类型数据没有简单易行的方法。所以你最好定义List of Object来存储行内容并准备编写巨大的IF:

if (row[i] instanceof String) {
 ...
} else if (row[i] instanceof Integer) {
 ...
}

等等。我在使用protobuf时模仿了混合类型的字段。

更多:如果要使用 List ,请忘记原语。不幸的是,Java泛型与原始类型不兼容。

答案 3 :(得分:1)

当数组中的项表示某些逻辑顺序时,您可以尝试在类似数据结构的表单中创建它们的表示。

class NameOfStructure {
  private String str1;
  private int    int1;
  private String str2;
}

稍后将该结构放入数组中。

NameOfStructure[] rows = new NameOfStructure[size];

NameOfStructure row = NameOfStructure[0];

String str1 = row.str1;
 int   int1 = row.int1;

另一种选择是创建Object []的数组类型,但是在从数组中检索项目之后必须将类型转换为expect。

Object[] row = new Object[size];
...
String  str1 = (String)  row[0];
Integer int1 = (Integer) row[1];

答案 4 :(得分:1)

我认为这是解决您问题的方法。我制作了一个适用于整数,字符串和浮点数的代码(其余的你可以完成)。

主要(有你的价值观)

public static void main(String[] args) {
        //Init
        ArrayList<ArrayList<Something>> mainList = new ArrayList<>();
        ArrayList<Something> sublist1 = new ArrayList<>();
        ArrayList<Something> sublist2 = new ArrayList<>();
        //Fill array lists
        sublist1.add(new Something("str1", 0));
        sublist1.add(new Something(5, 1));
        sublist1.add(new Something("str2", 0));
        sublist1.add(new Something("str3", 0));
        sublist1.add(new Something(3.5f, 2));
        //etc
        sublist2.add(new Something("str5", 0));
        sublist2.add(new Something(6, 1));
        sublist2.add(new Something("str6", 0));
        sublist2.add(new Something("str7", 0));
        sublist2.add(new Something(5.3f, 2));
        //etc
        //Add the two list in the main
        mainList.add(sublist1);
        mainList.add(sublist2);
        //Iterator
        int i = 0;
        for (ArrayList<Something> sublist : mainList) {
            i++;
            System.out.println("Results from list " + i);
            for (Something something : sublist) {
                switch (something.getType()) {
                    case 0: {
                        System.out.println("String value: " + (String) something.getValue());
                        break;
                    }
                    case 1: {
                        System.out.println("Integer value: " + (Integer) something.getValue());
                        break;
                    }
                    case 2: {
                        System.out.println("Float value: " + (Float) something.getValue());
                        break;
                    }


                }
            }
        }

    }

Class Something:

public static class Something {

        private Object value;
        private int type;

        /**
         * Constructor of Something class
         *
         * @param value
         * @param type type 0 String <br/>
         * type 1 Integer <br/>
         * type 2 float ....
         */
        public Something(Object value, int type) {
            this.value = value;
            this.type = type;
        }

        public Object getValue() {
            return value;
        }

        public void setValue(Object value) {
            this.value = value;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

    }

主要输出:

Results from list 1
String value: str1
Integer value: 5
String value: str2
String value: str3
Float value: 3.5
Results from list 2
String value: str5
Integer value: 6
String value: str6
String value: str7
Float value: 5.3