JAVA:带有重复的索引地图

时间:2015-02-18 15:59:59

标签: java dictionary

我想获得一张包含订单和重复的地图。

Map<String, Boolean> map = ?;

map.put("abc", true);
map.put("cba", true);
map.put("cba", true);
map.put("bca", false);
map.put("bac", false);
map.put("bca", true);
map.put("cab", true);
map.put("cba", true);
map.put("cba", false);
map.put("cba", true);

System.out.println(map);

我使用了LinkedHashMap,但它不允许重复。

Expected:  {abc=true, cba=true, cba=true, bca=false, bac=false, bca=true, cab=true, cba=true, cba=false, cba=true}
Retrieved: {abc=true, cba=true, bca=true, bac=true, cab=true}

是否有任何地图界面实现来实现我的目标?

UPD

Guava MultiMap不适合我的问题。

Multimap<String, Boolean> map = ArrayListMultimap.<String, Boolean>create();

打印

{cab=[true], abc=[true], cba=[true, true, true, false, true], bac=[false], bca=[false, true]}

UPD2

我找到了解决方案。 Apache Commons提供了元组类型Pair

所以我的代码可能看起来像这样

List<Pair<String, Boolean>> list = new ArrayList<>();

list.add(new ImmutablePair("abc", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("bca", true));
list.add(new ImmutablePair("bac", true));
list.add(new ImmutablePair("bca", true));
list.add(new ImmutablePair("cab", true));
list.add(new ImmutablePair("cba", true));
list.add(new ImmutablePair("cba", true));

现在打印

[(abc,true), (cba,true), (cba,true), (bca,true), (bac,true), (bca,true), (cab,true), (cba,true), (cba,true)]

但我仍然确定它应该是适当地图的一些好的实现。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作来存储带有重复项的有序列表。

List<String> map = new ArrayList<>();

map.add("abc" + '=' + true);
map.add("cba" + '=' + true);
map.add("cba" + '=' + true);
map.add("bca" + '=' + false);
map.add("bac" + '=' + false);
map.add("bca" + '=' + true);
map.add("cab" + '=' + true);
map.add("cba" + '=' + true);
map.add("cba" + '=' + false);
map.add("cba" + '=' + true);

System.out.println(map);

要创建一个Tuple类,你可以

public class Tuple<L,R> {
    private L left;
    private R right;

    Tuple(L left, R right) {
        this.left = left;
        this.right = right;
    }

    public static <L, R> Tuple<L, R> of(L left, R right) { 
        return new Tuple<>(left, right); 
    }

    public L left() { return left; }
    public R right() { return right; }

    public String toString() { return left + "=" + right; }

}

但是,在Java中,通常最好给这个类和字段名称一个有意义的名称和类型,而不是没有附加含义的通用数据元组。

答案 1 :(得分:0)

显然,您担心在地图中打印的输出格式。如果是这种情况,那么您可以使用现有的实现,只需覆盖toString()方法。

如果出于某种原因,您需要有关输入到地图的条目的绝对顺序的信息,您需要自己编写实现,为您执行此操作,因为使用当前实现只会保持相对于每个键,但不是绝对顺序。