具有重复值(键,值)的有序集合

3

我想知道是否有这些属性的集合:

  1. 键,值
  2. 允许重复的值
  3. 能够按值进行排序,并同时保留重复的值。

例如: 不排序

(1,2)
(2,1)
(3,1)
(4,2)

已排序

(2,1)
(3,1)
(1,2)
(4,2)

我尝试使用比较器来实现 treeMap ,但是它移除了重复的值。
@Override
    public int compare(Object o1, Object o2) {
        Comparable valueA = (Comparable) map.get(o1);
        Comparable valueB = (Comparable) map.get(o2);

        int res = 0;
        if (valueA.compareTo(valueB) < 0) {
            res = 1;
        } else if (valueA.compareTo(valueB) > 0) {
            res = -1;
        } else {
            res = 0;
        }
        return res;
    }

你能展示一下你使用 TreeMap 的代码吗? - Rohit Jain
具有相同值的条目应如何排序?在您的示例中,顺序[(3,1), (2,1), (1,2), (4,2)]是否可接受? - Ted Hopp
@SimonAndréForsberg 它不允许重复的键。但是值,当然可以。 - Rohit Jain
我已经很久没有使用Java了,但我不认为有这样的集合(至少没有一个会对相同值的键进行排序)。你尝试过编写自己的键值对类及其自己的排序器,然后将整个内容放入简单排序集合中吗? - rumtscho
@RohitJain 正确。我当然是指键 :) - Simon Forsberg
显示剩余2条评论
2个回答

3
您可以使用Guava的TreeMultimap来创建有序的多重映射。这将按照相同键中的值进行排序,但如果您需要按值排序迭代,则最好的方法是交换键和值(并放弃按键查找的能力)。

据我所知,TreeMultiMap 只提供了对键的排序,而不是值。 - Ted Hopp
1
@TedHopp javadoc 的第一句话: "实现了一个 Multimap,其键和值根据它们的自然顺序或提供的比较器进行排序。"(重点添加) - yshavit
1
@yshavit - 这指的是由get和其他与单个键相关的方法返回的集合顺序。请向我们展示哪个API调用将返回按值排序的整个集合的迭代器(这就是OP所要求的)。 - Ted Hopp
1
@ChrisJester-Young - 那应该是你的答案。如果没有解释如何在TreeMultimap的基础上构建解决方案,而且它并不能(直接)完成OP需要的工作,那么说“使用TreeMultimap”并不是一个很好的答案。 - Ted Hopp
1
为了满足我认为是 OP 的要求(似乎是按键查找),您需要两个对象:一个将键映射到值的 Map 和一个将值映射到 [键] 的 TreeMultimap。为了完全封装,最好将它们都作为新类的私有字段,并支持高级操作(put、按键获取、按值排序的键值对迭代等)。 - yshavit
显示剩余3条评论

1

请再仔细阅读,以便理解!

您想要有序的值。

(2,1)
(3,1)
(1,2)
(4,2)

在什么情况下需要进行操作?我认为你需要交换键和值并使用有序的键集合。

如果存在重复,我会使用一个集合。类似于这样:

1 - > (2, 3)

2 - > (1, 4)

类似于:

LinkedHashSet<Integer,  ArrayList<Integer>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接