当前位置: 首页 > 知识库问答 >
问题:

如何先按值排序,然后按键排序,以防重复?[副本]

农雅畅
2023-03-14

我有一个类似于以下内容的HashMap:

 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
 map.put(3, 2);
 map.put(7, 2);
 map.put(5, 1);
 map.put(10, 4);
(5, 1)
(3, 2)
(7, 2)
(10, 4)

有什么建议吗?

我首先比较值,只有在值重复的情况下才比较键。所以我同时使用键和值,而不仅仅是值。

共有1个答案

仉宪
2023-03-14

您可以使用streams API来实现它:

LinkedHashMap<Integer, Integer> resultSet = 
  map.entrySet().stream()
                .sorted(Map.Entry.<Integer, Integer>comparingByValue()
                             .thenComparing(Map.Entry.comparingByKey()))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                        (oldValue, newValue) -> oldValue, LinkedHashMap::new));

排序的中间操作可以采用比较器实例,在本例中为:

Map.Entry.<Integer, Integer>comparingByValue()
                                 .thenComparing(Map.Entry.comparingByKey())

即,通过映射值进行比较,如果两个给定值相同,则通过键进行比较。

注意合并函数(oldValue,newValue)->oldValue在本例中是毫无意义的,因为流的源(map.entrySet())永远不会包含重复的键。但是,我们仍然需要它,否则我们不能为新值指定累加器的类型,在本例中,为LinkedHashMap实例来维护插入顺序。

您可能还希望查看toMap方法,以获得有关它如何工作的更多信息。

 类似资料:
  • 问题内容: 在发现了惊人的发现之后,我再次陷入了困境。 问题是我有一个形式的字典,我需要按其整数值的降序对其进行排序, 但是 如果两个元素的值相同,则按键的升序排列。 一个使它更清楚的例子: 经过研究后,我得出以下结论: 这是因为它对值和键都进行了反向排序。我需要不撤消的钥匙。 问题答案: 就像是

  • 问题内容: 我有一个带有数字值的字符串键数组,可用于具有每个标签出现次数的标签列表中,因此: 这是为了我可以按降序显示标签列表,因此: 我可以使用 arsort 通过出色的值进行反向排序,但是我还希望具有相同数字值的所有标签都按字母顺序排序,因此最终结果可以是: 有办法可以做到吗?我猜想 usort 可能是要走的路,但是我看了php.net上的示例,我的眼睛呆呆了!非常感谢!!! 问题答案: 看一

  • (“Samsung”,(“Galaxy”,20)) (“苹果”,(“iPhone”,40)) 我需要按照内部键的字母顺序对映射进行降序排序(在这个例子中是模型名) 我到目前为止的排序是这样的: Map.EntrySet().Stream.Foreach(entry->entry.GetValue().EntrySet().Stream().Sorted(Comparator.Comparative

  • 我的问题是如何根据值和键对内容进行排序,并得到一个? 首先,条目需要按值降序排序,如果值发生冲突,也要按键降序排序。 给定的示例: 预期订单:

  • 问题内容: 我只想使用Collections.sort或Arrays.sort首先按x然后按y对点列表(Point类)进行排序。 我有一个像这样实现Comparable的Ponto类: 但是现在我也想在x之后按y排序。 如何通过修改上面的代码来做到这一点?还是这是一种更好且“干净”的 方法?我还使用了将此代码传递给C ,在C 中,我 使用等效的可比较方法创建了一个称为Point的结构。 问题答案:

  • 问题内容: 如何根据值对字典进行排序,以便输出为: 当前尝试(排序不正确): 问题答案: 您需要对字典值而不是键进行排序。您可以从字典中创建一个元组数组,按其值对它进行排序,如下所示: Xcode 9•Swift 4 或 Xcode 8•Swift 3 使用按键对字典进行排序 使用字典的键和本地化的比较来对字典进行排序: