Java如何创建具有多个列/数据类型的ArrayList

时间:2014-03-10 14:44:55

标签: java arraylist

我正在尝试创建一个ArrayList,它将有3列类型(日期,日期,字符串)

所以它真的像多个值的表,例如:

Jan 11, Jan 11, "started"
Jan 11, Jan 15, "running"
... 
Jan 20, Jan 23, "slowing" 
Jan 23, Jan 23, "stopped"

我将如何创建像这样的ArrayList?或者还有其他更好的数据格式吗?对不起,我是Java的新手并且正在努力学习。此外,我需要能够在不同的类之间传递这种数据结构。

非常感谢!

8 个答案:

答案 0 :(得分:2)

创建持有者类:

 class Holder{
         //your fields : Date, Date, String
 }

然后:

 ArrayList<Holder> list = new ArrayList<Holder>();

答案 1 :(得分:2)

ArrayList中,您不能有多个列,ArrayList类似于一维数组,您可以存储任何数据类型的对象。

解决方案取决于您尝试解决的问题。 如果您尝试存储在一行中的数据是相关的并且具有一些唯一标识,则可以使用HashMap, 或者您可以创建一个以列为字段的类,并将该类的实例存储在ArrayList中。

希望这有帮助。

答案 2 :(得分:1)

创建一个具有属性的类,然后使用类类型声明一个列表,如:

public class MyClass {

    private Date d1;
    private Date d2;
    private String s;

}

然后将列表声明为:

ArrayList<MyClass> list = new ArrayList<MyClass>();

答案 3 :(得分:1)

public class MyObject() {
   Date date1;
   Date date2;
   String status;

   public MyObject() {

   }

   //Getters & Setters
}

然后在main中,或者您引用此数据的地方

List< MyObject> list = new ArrayList<>();

答案 4 :(得分:1)

Java没有用于保存不同类型的数据结构。但是,我创建了适合您的 Tuple 数据结构。

样本用法:

public class TupleTest {

@Test
public void testOneType() {
    Tuple t1 = Tuple.Factory.create(1);
    Tuple t2 = Tuple.Factory.create(1);
    assertEquals(t1, t2);
}

@Test
public void testTwoTypes() {
    Tuple t1 = Tuple.Factory.create(1, "a");
    Tuple t2 = Tuple.Factory.create(1, "a");
    assertTrue(t1.equals(t2));
}

@Test
public void testGetIndex() {
    Tuple t1 = Tuple.Factory.create(1, "a");
    assertTrue((Integer) t1.get(0) == 1);
}
}

public class Tuple {

private final Object[] items;

private Tuple(Object... items) {
    this.items = items;
}

public static class Factory {
    public static Tuple create(final Object... items) {
        return new Tuple(items);
    }
}

/**
 * 
 * @return
 */
public synchronized int size() {
    return items.length;
}

@Override
public int hashCode() {
    // TODO Auto-generated method stub
    int hash = 17;
    for (Object obj : items) {
        if (obj != null)
            hash = hash * 31 + obj.hashCode();
    }
    return hash;
}

@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    boolean res = true;
    final int size = this.size();
    final Tuple p = (Tuple) obj;

    if (!(obj instanceof Tuple))
        res = false;

    if (obj == null || this == obj)
        res = false;

    if (p.size() != size)
        res = false;

    for (int i = 0; i < size; i++) {
        if (!p.items[i].getClass().equals(this.items[i].getClass()))
            res = false;

        if (!p.items[i].equals(this.items[i]))
            res = false;
    }

    return res;
}

/**
 * Return string of multiple types "String.class Number.Class Integer.Class"
 */
@Override
public String toString() {
    // TODO Auto-generated method stub
    StringBuilder sb = new StringBuilder();
    for (Object item : items) {
        sb.append(item.toString() + " ");
    }
    return sb.toString();
}

public Object get(int index) {
    return items[index];
}

 }

答案 5 :(得分:0)

public class MyObject {
    Date d1;
    Date d2;
    String s;
}


List<MyObject> list = new ArrayList<MyObject>();

答案 6 :(得分:0)

你可以使用HashMap是最好的方法

如何使用HashMap,(这个例子是@Stephen C)

The value in the HashMap, to find values are sought by means of the associated key.
The Hashmap provide quick search

声明的例子

     //1
     HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
     //2    
     HashMap<String, ArrayList<String>> hashMap2= new HashMap<String, ArrayList<String>>()

//1
    hashMap.put("Value1", new Integer(1));
//2     
    ArrayList<String> arrList = new ArrayList<String>();

        arrList .add("value");

    hashMap2.put("value1", arrList );

获取

//1
    hashMap.containsValue(1));
//2

while(hashMap2.hasNext()) {

      System.out.println("Key = '" + key + "' has values: " + values);

}

我希望这些例子可以为许多不理解为“Stephen C”的人提供解决方案。

答案 7 :(得分:0)

正如其他人已经解释的那样,在Java中这样做的惯用方法是为你的三元组创建一个类。

我想添加其他内容,这就是为您的实际数据建模。而不是将它们称为d1,d2和s - 将字段命名为实际的字段。

我不知道你的日期代表什么,但这是我的意思的一个例子:

class Record {
    Date begin, end;
    String status;
}

List<Record> records;