字符串中的第一个非重复字符使用java给出错误的字符?

时间:2015-02-24 11:04:34

标签: java string charts linkedhashmap

我已经编写了代码来从字符串中打印出第一个非重复字符,一切正常。但是在打印它的字符时它给出了null.Example from Sting input =" ttaasjji kkk eee"然后它应该打印'作为第一个不重复的字符。以下是我的java代码。

public static void main(String[] args) {
    LinkedHashMap hm = new LinkedHashMap();
    //HashMap hm=new HashMap();
    String input = "ttaasjjikkk eee ";
    input = input.trim();
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        Integer val = (Integer) hm.get(c);
        if (c != ' ') {//to exclude space count
            if (val != null) {
                hm.put(c, val + 1);
            } else {
                hm.put(c, 1);
            }
        }
    }
    System.out.println(hm);//each char count      
    Iterator itr = (Iterator) hm.keySet().iterator();
    while (itr.hasNext()) {
        Object temp = hm.get(itr.next());
        String sTemp = temp.toString();
        int value = Integer.parseInt(sTemp);
        if (value == 1) {
            System.out.println("First non repeated character is: " + hm.get(temp) + "," + temp);
            return;
        }
    }
}

请帮助我,我们将不胜感激。

2 个答案:

答案 0 :(得分:2)

你正在打印错误的东西。您应该打印值为1的第一个键(字符)。

而是打印hm.get(temp),这是空的,因为tempInteger,而您的地图没有Integer个键。

应该是:

while (itr.hasNext()) {
    Character key = (Character) itr.next();
    Object temp = hm.get(key);
    String sTemp = temp.toString();
    int value = Integer.parseInt(sTemp);
    if (value == 1) {
        System.out.println("First non repeated character is: " + key + "," + temp);
        return;
    }
}

我建议您使用参数化类型,以避免这种混淆。而不是原始LinkedHashMap,请使用LinkedHashMap<Character,Integer>

输出:

{t=2, a=2, s=1, j=2, i=1, k=3, e=3}
First non repeated character is: s,1

答案 1 :(得分:1)

您正在使用地图的键集。您需要条目集,以便检查每个条目的值。这就是存储计数的原因 - 无需将字符串解析为整数。

您还应修复所有代码以使用泛型,以避免所有转换:

import java.util.*;

class Test {
   public static void main(String[] args) {
       // Key type is Character, value type is Integer
       Map<Character, Integer> map = new LinkedHashMap<>();
       String input = "ttaasjjikkk eee ";
       input = input.trim();
       for (int i = 0; i < input.length(); i++) {
           char c = input.charAt(i);
           Integer val = map.get(c);
           if (c != ' ') {
               if (val != null) {
                   map.put(c, val + 1);
               } else {
                   map.put(c, 1);
               }
           }
       }

       System.out.println(map);

       // Enhanced for loop to make it easier to iterate
       for (Map.Entry<Character, Integer> entry : map.entrySet()) {
           if (entry.getValue() == 1) {
               System.out.println("First non repeated character is: " 
                   + entry.getKey());
               return;
           }
       }
   }
}