【问题标题】:How to Reverse order of values in Set<String>如何反转 Set<String> 中的值顺序
【发布时间】:2018-04-22 06:35:53
【问题描述】:

我想反转Set&lt;String&gt;中的值

所以,我正在从一些 HashMap 创建一个键 Set&lt;String&gt; 并打印出值,即键。

Set<String> movies =  movieList.keySet();
for(String movie : movies) {
    output += movie + "\n";
}

我需要将 Set&lt;String&gt; 的值从最后一个值反转为第一个值这可能吗?

【问题讨论】:

  • Set 中的元素是not 有序的...另一方面,LinkedHashSet...

标签: java collections hashmap set reverse


【解决方案1】:

如果你使用的是Java8,你可以试试:

List<String> sorted = movieList.keySet().stream()
                .sorted(Collections.reverseOrder())
                .collect(Collectors.toList());

如果您只想要输出字符串,甚至更好:

String output = movieList.keySet().stream()
                .sorted(Collections.reverseOrder())
                .collect(Collectors.joining("\n"));

但如果意图只是按照 Andreas 的建议反转 map.keySet ......那么

ArrayList<String> list = new ArrayList<>(movieList.keySet());
Collections.reverse(list);
//list is now in reverse order of the keySet

【讨论】:

  • 这将按照与键 自然 顺序相反的顺序对值进行排序,而不是与 keySet 中的顺序相反。
  • 虽然你是对的,但是在其原始上下文中的问题是模棱两可的,因为 Map 中的 Set 已经不能保证你知道它的填充顺序,所以 Set这里不是一个纯粹的集合,目的是保持顺序,在字符串中获取连接结果的行之间还有一个附带问题。否则只有反向循环才能解决问题。
【解决方案2】:

如果您想对Map 的键进行排序,则必须使用不同的Map 实现,因为HashMap 的键没有排序。

您可以使用TreeMap。您可以将确定键顺序的Comparator 传递给它的构造函数。这将确定keySet() 返回的Set 中的键的顺序。

例如,如果您希望电影按照相反的字典顺序排序:

Map<String,Movie> moviesByName = new TreeMap<>((s1,s2)->s2.compareTo (s1));

或者,正如 lexcore 建议的那样:

Map<String,Movie> moviesByName = new TreeMap<>(Comparator.<String>naturalOrder().reversed());

【讨论】:

  • 能否举个例子来说明清楚?
  • 2 个问题。 String 和 Movie 是这里 hashmap 的键/值吗?你能详细说明 (s1,s2)->s2.compareTo (s1) 是什么意思吗?
  • @Shaz 1. 是的 2. 这是一个 lambda 表达式(从 Java 8 开始可用)。这是实现Comparator&lt;String&gt; 接口的更短的方法。
  • 您是否尝试阅读java.util.Map 的JavaDoc?您是否熟悉 Java 8 流和 lambda 函数?
  • @Eran FTFY:Map&lt;String,String&gt; moviesByName = new TreeMap&lt;&gt;(Comparator.&lt;String&gt;naturalOrder().reversed());。不知道为什么类型推断不起作用。
【解决方案3】:

Set 的一个关键特性是它没有排序。所以你需要使用另一种数据结构来实现这个目标。最简单的解决方案可能是List,但随后您会失去Set 的质量,使其不包含相等的整体(entry.equals(otherentry) == true)

如果您想按填充(或反向)的顺序检索条目并且仍想保留Set 质量,您可以使用LinkedHashSet

Eran 的解决方案也是可能的,但您需要创建一个比较器,以导致添加到 TreeMap 的顺序。

【讨论】:

    【解决方案4】:
    After getting values stored in a Set, Add all values of Set into a List then apply reverse function of list. Below is an example
    
    import java.util.*;
    class Test
    {
    public static void main(String args[])
    {
    Set h=new LinkedHashSet();
    List h2 = new LinkedList();
    h.add("Lovely");
    h.add("Professional");
    h.add("University");
    h2.addAll(h);   
    System.out.println(h);
    Collections.reverse(h2);
    System.out.println(h2);
    }
    }   
    

    【讨论】:

    • 如果您将代码格式化为可读,我可能会赞成它。但话又说回来,直接从h 创建的ArrayList 会更好。此外,问题不是关于有序的LinkedHashSet,而是来自HashMap 的无序keySet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多