【问题标题】:Java How to create a ArrayList with multiple columns/datatypesJava 如何创建具有多列/数据类型的 ArrayList
【发布时间】:2014-04-13 17:51:43
【问题描述】:

我正在尝试创建一个包含 3 列类型(日期、日期、字符串)的 ArrayList

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

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

我将如何创建这样的 ArrayList?还是有其他更好的数据格式?抱歉,我对 Java 很陌生,正在努力学习。另外,我需要能够在不同的类之间传递这个数据结构。

非常感谢!

【问题讨论】:

标签: java arraylist


【解决方案1】:

你可以使用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”的人提供一个解决方案。

【讨论】:

  • 我认为这是一个非常糟糕的答案。没有理由,没有解释。只是一个意见。技术上也是错误的......不需要查找,并且 OP 表中没有明显的“键”。
  • 问题不是要求任何涉及查找的内容。更合适的解决方案是自定义元组类的 ArrayList。更简单、更高效,并满足 >>list
【解决方案2】:

正如其他人已经解释的那样,在 Java 中执行此操作的惯用方式是为您的三元组创建一个类。

不过,我想添加一些其他内容,那就是对您的实际数据进行建模。不要称它们为 d1、d2 和 s,而是根据它们的实际名称来命名这些字段。

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

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

List<Record> records;

【讨论】:

    【解决方案3】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      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】:
        public class MyObject() {
           Date date1;
           Date date2;
           String status;
        
           public MyObject() {
        
           }
        
           //Getters & Setters
        }
        

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

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

        【讨论】:

          【解决方案6】:
          public class MyObject {
              Date d1;
              Date d2;
              String s;
          }
          
          
          List<MyObject> list = new ArrayList<MyObject>();
          

          【讨论】:

          • 请添加 cmets 或解释。
          【解决方案7】:

          创建一个持有者类:

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

          然后:

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

          【讨论】:

            【解决方案8】:

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

            public class MyClass {
            
                private Date d1;
                private Date d2;
                private String s;
            
            }
            

            然后将列表声明为:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-04
              • 2017-12-19
              • 1970-01-01
              • 1970-01-01
              • 2014-06-17
              • 2019-09-15
              • 2020-06-09
              相关资源
              最近更新 更多