【问题标题】:HashMap function keyset() in javajava中的HashMap函数keyset()
【发布时间】:2017-04-26 16:46:04
【问题描述】:
HashMap<Character,Character> h=new HashMap<>();
for(int i=0; i<str.length(); i++){
    h.put(str.charAt(i),str.charAt(i));
}
Set<Character> keys=h.keySet();

Character [] arr=new Character[keys.size()];

keys.toArray(arr);
String ans="";
for(int i=0; i<arr.length; i++) {
    ans+=arr[i];
}

在这个问题中,我必须从输入的字符串中删除重复项。它适用于普通字符,但当输入如下:o&amp;6nQ0DT$3 即包含特殊字符时,它不会按顺序打印。

input: o&6nQ0DT$3
expected output: o&6nQ0DT$3 
my output: 0Q3DT$&6no

我在一组“键”中获取keyset() 方法返回的值(因为返回类型是在keyset() 内部设置的),然后我创建了一个长度键数组并将字符串放入其中以供返回。但它的顺序不同。

【问题讨论】:

  • HashMap 没有固定的顺序。 (来自 HashMap javaDoc:“此类不保证映射的顺序;特别是,它不保证顺序会随着时间的推移保持不变。”)如果您希望 Map 保持插入顺序,请使用LinkedHashMap 代替
  • (1) 不要使用Map,因为你不需要映射,但要保证元素的唯一性,这是Set的作用。 (2) HashMap(或HashSet)不保留插入顺序(或任何特定顺序)。要保存它,请使用 LinkedHashMap,或者在您的情况下使用 LinkedHashSet。

标签: java string hashmap keyset


【解决方案1】:

HashMap(或HashSet,就此而言)没有内在顺序。这对某些输入有效的事实只是幸运的一击。正如@javaguy 建议的那样,您可以使用LinkedHashMap,或者使用流实现整个练习可能更容易:

String input =  "o&6nQ0DT$3";
String output = input.chars()
                     .distinct()
                     .mapToObj(c -> String.valueOf((char) c))
                     .collect(Collectors.joining());

【讨论】:

  • 我喜欢 java 8 的使用方式。
【解决方案2】:

HashMap 不保证/保留元素的插入顺序,因此请使用LinkedHashMap 保留您要插入的字符的顺序:

Map<Character,Character> h = new LinkedHashMap<>();//use LinkedHashMap

【讨论】:

    【解决方案3】:

    LinkedHashMap & LinkedHashSet 维护插入顺序。

    String s = "o&6nQ0DT$3";
    Map<Character,Character> hm = new LinkedHashMap<>();    
    for(Character c:s.toCharArray())
        hm.put(c, c);
    System.out.println(hm);
    

    输出:

    {o=o, &=&, 6=6, n=n, Q=Q, 0=0, D=D, T=T, $=$, 3=3}
    

    但是LinkedHashSet内部使用hashmap来存储值,所以LinkedHashMap的性能会稍微好一些。

    【讨论】:

      【解决方案4】:

      可以不用HashMap吗?

          String str = "Teste";
          String finalStr = ""; 
      
          for (Character charInString: str.toCharArray()) {
              if(!finalStr.contains(charInString.toString()))
              {
                  finalStr += charInString;
              }
      
          }
          System.out.println(finalStr);
      

      改善,怎么样? TreeSet 的解决方法。

          String str = "teste";
          HashMap<Integer, Character> map = new HashMap<>();
          for (int i = 0; i < str.length(); i++) {
              if (!map.containsValue(str.charAt(i))) {
                  map.put(i, str.charAt(i));
              }
          }
          SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
          keys.forEach(k -> System.out.println(k + " value " + map.get(k).toString()));
      

      【讨论】:

      • 强制使用
      【解决方案5】:

      我不知道您是如何充分使用哈希图的,也许您想用 ArrayList 替换,如下所示:

      ArrayList<Character> h = new ArrayList<>();
      for(int i=0;i<str.length();i++)
      {
         if(!h.contains(str.charAt(i)))
            h.add(str.charAt(i));
         }
      ...
      

      arraylist 也将保持相同的插入顺序。

      【讨论】:

      • 但他想删除重复项。
      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2011-01-17
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多