【问题标题】:3-Dimension List or Map3维列表或地图
【发布时间】:2012-05-11 03:11:01
【问题描述】:

我需要一个 3 维(如列表或地图)之类的东西,我在循环中用 2 个字符串和一个整数填充它。但是,不幸的是,我不知道要使用哪种数据结构以及如何使用。

// something like a 3-dimensional myData
for (int i = 0; i < 10; i++) {
    myData.add("abc", "def", 123);
}

【问题讨论】:

  • 这三个值有什么关系?
  • 它们动态地来自 JTextFields 和 JButtons。
  • 好的,但是你想和他们吗?
  • 不确定您的确切用例是什么,因此提供了更多选项。如果您可以依赖开源库,那么您可以利用 Guava's Table 类。
  • 可以使用嵌套地图Map&lt;String, Map&lt;String, Integer&gt;&gt;

标签: java arrays list dictionary


【解决方案1】:

创建一个将三者封装在一起的对象,并将它们添加到数组或列表中:

public class Foo {
    private String s1;
    private String s2; 
    private int v3;
    // ctors, getters, etc.
}

List<Foo> foos = new ArrayList<Foo>();
for (int i = 0; i < 10; ++i) {
    foos.add(new Foo("abc", "def", 123);
}

如果你想插入数据库,写一个DAO类:

public interface FooDao {
    void save(Foo foo);    
}

根据需要使用 JDBC 实现。

【讨论】:

  • 我需要一个类似的“容器”类来存储三个属性。我通过构造函数初始化这些属性,并且我需要分别访问每个属性。该类中没有任何逻辑,只有这三个属性和一个构造函数。访问这些属性的最佳方式是什么?在这种情况下,是否可以将属性设置为公共,或者我应该编写 getter?属性是最终的。
  • 好吗?谁会阻止你?将它们公开为最终版本;它们是不可变的。期待 OO 警察来敲门。
  • 我在问是否可以,因为我不想编写违反 OO 概念的代码。根据您的回答,我假设最终属性不需要吸气剂,因为它们无论如何都无法更改?还是只有在这种小情况下才可以“最终公开”?
  • “反对 OO 概念”?没有OO警察。你可以做任何你想做的事。您应该考虑并理解其中的含义。你不需要许可。这是代码。如果它不起作用,请更改它。
  • 这个答案为我节省了很多时间。
【解决方案2】:

Google 的Guava 代码如下所示:

import com.google.common.collect.Table;
import com.google.common.collect.HashBasedTable;

Table<String, String, Integer> table = HashBasedTable.create();

for (int i = 0; i < 10; i++) {
    table.put("abc", "def", i);
}

上面的代码将在 HashMap 中构造一个 HashMap,其构造函数如下所示:

Table<String, String, Integer> table = Tables.newCustomTable(
        Maps.<String, Map<String, Integer>>newHashMap(),
        new Supplier<Map<String, Integer>>() {
    @Override
    public Map<String, Integer> get() {
        return Maps.newHashMap();
    }
});

如果您想覆盖底层结构,您可以轻松更改它。

【讨论】:

    【解决方案3】:

    只需创建一个类

     class Data{
      String first;
      String second;
      int number;
     }
    

    【讨论】:

      【解决方案4】:

      答案取决于值之间的关系。

      1) 您只想按相同的顺序存储这三个元素:创建一个包含所有三个元素的自定义类,并将该类的一个实例添加到 List&lt;MyData&gt;

      2)您想将第一个字符串与第二个和第三个数据相关联(并将第二个与 int 相关联):创建一个 Map> 并向其中添加元素(您必须为每个新的第一个字符串)

      3)您不想保留重复项,但您不想/不需要地图。:创建自定义类型(a'la 1))并将它们放入Set&lt;MyData&gt;

      3) 混搭

      【讨论】:

        【解决方案5】:

        您可以使用此代码!

        public class List3D {
        
            public static class MyList {
                String a = null;
                String b = null;
                String c = null;
        
                MyList(String a, String b, String c) {
                    this.a = a;
                    this.b = b;
                    this.c = c;
                }
            }
        
            public static void main(String[] args) {
        
                List<MyList> myLists = new ArrayList<>();
                myLists.add(new MyList("anshul0", "is", "good"));
                myLists.add(new MyList("anshul1", "is", "good"));
                myLists.add(new MyList("anshul2", "is", "good"));
                myLists.add(new MyList("anshul3", "is", "good"));
                myLists.add(new MyList("anshul4", "is", "good"));
                myLists.add(new MyList("anshul5", "is", "good"));
        
                for (MyList myLista : myLists)
                    System.out.println(myLista.a + myLista.b + myLista.c);
            }
        }
        

        【讨论】:

          【解决方案6】:

          如果你不想创建一个类:

          Map<String, Map<String,Integer>> myData;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-11-30
            • 2014-01-20
            • 1970-01-01
            • 1970-01-01
            • 2014-08-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多