3
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&6nQ0DT$3即包含特殊字符时,它不会按顺序打印。

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

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

4

5 回答 5

2

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

String input =  "o&6nQ0DT$3";
String output = input.chars()
                     .distinct()
                     .mapToObj(c -> String.valueOf((char) c))
                     .collect(Collectors.joining());
于 2017-04-26T16:55:34.947 回答
1

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的性能会稍微好一些。

于 2017-04-26T17:34:25.433 回答
1

没有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()));
于 2017-04-26T16:57:31.607 回答
1

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

Map<Character,Character> h = new LinkedHashMap<>();//use LinkedHashMap
于 2017-04-26T16:50:48.250 回答
0

我看不到您如何充分使用哈希图,也许您想用 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));
   }
...

数组列表也将保持相同的插入顺序。

于 2017-04-26T16:56:45.993 回答