【问题标题】:java implementation (list with different data types)java实现(不同数据类型的列表)
【发布时间】:2011-12-01 12:20:36
【问题描述】:

我仍然不太习惯 Java。我有一个应该包含一个列表的类。可以想象这个列表代表表中的一行(列名,某种类型的值):

Name - "Oskar",
Age - 28,
weight - 75.5,
weightUnit - "kilogram",
...

由于列表的内容应该是灵活的,我不能使用类成员变量。 基本上,程序员对内容视而不见。但是,在某些时候 - 我必须提取所有具有双值的条目。你会如何实现这样的东西?

【问题讨论】:

    标签: java list types


    【解决方案1】:

    将信息封装在一个对象中,然后有一个表示对象的列表。例如,

    public final class TableRow{
        private final String name;
        private final int age;
        private final double weight;
        private final String weightUnit;
    
        public TableRow(String name, int age, double weight, String weightUnit){
            ...
        }
    
        // include accessors
    }
    

    然后其他类中的列表声明会这样,

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

    【讨论】:

    • 但它会是什么样子?以及如何获取对象是哪种类型的信息?你能提供一些示例代码吗?
    • 如我所说,我事先不知道内容。最终用户将决定任何条目的名称和类型。他可能希望存储有关蜂鸟的信息,而不是人类蜜蜂的年龄和体重......
    • 嗯..令人困惑。对我来说,这听起来像是一个糟糕的设计。
    • hmm,这就像提供一个空的 excel 表 - 在用户将放入其中之前您不会知道,但您必须根据数据类型以正确的方式处理它...... .
    【解决方案2】:

    您可以使用HashMap

     Map<String, String> m = new HashMap<String, String>();
    

    【讨论】:

    • 不确定,这有什么帮助...?哈希映射将包含什么?
    • hashmap 将包含例如 Name 作为键和 Oscar 作为值等
    • 但是每个值都是字符串?作为字符串的键很好,但值应该是不同的可能类型。
    • 我想Map&lt;String, Object&gt; 可能会起作用。然后是其中的List,用于该行。
    【解决方案3】:

    您可以创建一个表示列的类,然后将一行表示为列列表:

    public class Column {
        private String name;
        private Class clazz;
        private Object value;
    
        public Column(String name, Class clazz, Object value) {
            this.name = name;
            this.clazz = clazz;
            this.value = value;
        }
    
        // ...
    }
    

    您的数据将是:

    List<Column> row = new ArrayList<Column>();
    row.add(new Column("Name", String.class, "Oskar"));
    row.add(new Column("Age", Integer.class, 28));
    row.add(new Column("weight", Double.class, 75.5));
    row.add(new Column("weightUnit", String.class, "kilogram"));
    

    但是,您似乎正在尝试创建一个数据库,因此您可能希望拥有一个 Table 类,该类将具有一个 List&lt;ColumnDescriptor&gt;,其中 ColumnDescriptor 将类似于上面的 Column 类,只有没有值——只有名称和类型。然后可能有一个 TableRow 类,它有一个 List&lt;Object&gt; 的所有值。当您向表中添加一行时,您需要验证这些值是否与该表的列类型兼容。

    您可能想看看JDBC 是如何为灵感而设计的。支持所有需要的通用性、功能性并使其成为类型安全的,需要做很多工作。除非您真的需要 ORM 工具、自定义报告解决方案或实际数据库,否则您可能需要重新考虑设计并询问是否需要这么多的通用性。 (“做最简单的事情。”)

    【讨论】:

    • 非常感谢!这是我一直在寻找的解决方案。但我也会考虑是否有任何不太通用的方法。没想到这个任务这么难。
    【解决方案4】:

    如果您不想创建课程。试试这样的。

    ArrayList<List> arrayList = new ArrayList<>();
    arrayList.add(Arrays.asList("String 1", 2011.57, 5));
    arrayList.add(Arrays.asList("String 2", 201.01, 16));
    arrayList.add(Arrays.asList("String 3", 2012, NULL));
    arrayList.add(Arrays.asList("String 4", 20.1, 19));
    
    for (List list : arrayList) {
        System.out.println(
                 list.get(0) + " " + list.get(1) + " " + list.get(2));
    }
    

    在上面的例子中。您可以创建一个 ArrayList,它分别存储具有 {String, Double, Integer} 数据类型的 List 集合。

    注意:Java 创建不同类型的列表是一种不好的做法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2011-05-20
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多