用于存储键-值-值等元素的集合

时间:2018-07-11 19:38:45

标签: java collections

哪个集合可用于存储项,例如键值对值?例如,我需要这样的东西:

  elements.add (0, "first", 1);
  elements.add(1, "second", 2);

3 个答案:

答案 0 :(得分:4)

您应该定义自己的类来定义值,并使用Map<Integer, MyValue>作为整体结构。

示例:

public class MyValue{
    public MyValue(String string, int i){
       ...
    }
}

并使用它:

Map<Integer, MyValue> elements = new HashMap<>();
elements.put(0, new MyValue("first", 1));

您可以选择将List作为值,但是通用List依赖于特定类型,例如List<String>List<Integer>。因此,在您的情况下,当您在值中混合类型时,我会避免这种方式。

您还有其他一些不需要引入自定义类的替代方法,但是通常对于必须阅读/维护代码的人来说,这往往是不清楚的:javafx.util.Pair<K,V>java.util.AbstractMap.SimpleImmutableEntry<K, V>是它们的示例。

答案 1 :(得分:2)

定义一个类Triple,它将使用三个参数。

public class Triple<K, V1, V2> {

  private K key;
  private V1 value1;
  private V2 value2;

  public Triple(K a, V1 value1, V2 value2) {
    this.key = a;
    this.value1 = value1;
    this.value2 = value2;
  }

  public K getKey() {
    return key;
  }

  public V1 getValue1() {
    return value1;
  }

  public V2 getValue2() {
    return value2;
  }
}

然后添加另一个类TripleList,它将作为一个集合,您可以在其中添加Triple的实例:

  public  class TripleList<K, V1, V2> implements Iterable<Triple<K, V1, V2>> {

    private List<Triple<K, V1, V2>> triples = new ArrayList<>();

    public void add(K key, V1 value1, V2 value2) {
      triples.add(new Triple<>(key, value1, value2));
    }

    @Override
    public Iterator<Triple<K, V1, V2>> iterator() {
      return triples.iterator();
    }
  }

使用它们,您可以执行以下操作:

  public static void main(String[] args) {
    List<Triple<Integer, String, Integer>> list = new ArrayList<>();
    list.add(new Triple<Integer, String, Integer>(0, "first", 1));
    list.add(new Triple<Integer, String, Integer>(1, "second", 2));

    TripleList<Integer, String, Integer> elements = new TripleList<>();
    elements.add(0, "first", 1);
    elements.add(1, "second", 2);

    for (Triple<Integer, String, Integer> triple : elements) {
       System.out.println(triple.getKey() + "," + triple.getValue1() + "," + triple.getValue2());  
    }
  }

您要求输入CollectionTripleList实际上不是Collection,因为它没有实现Collection。但这应该可以通过委托内部列表triples的方法来实现。

答案 2 :(得分:2)

如果您使用的是JDK9

Map<Integer,Map.Entry<String,Integer>> map=new HashMap<>();

现在您可以在Map界面中使用静态方法项(K k,V v)创建Map.Entry https://docs.oracle.com/javase/9/docs/api/java/util/Map.html#entry-K-V-

现在,对于Java程序员来说,从使用return Map.entry("firstValue","secondValue");的方法返回两个值的生活将变得很有趣。