是否可以在同一循环中从Hashmap中找到值的第一个实例?

Bob*_*Doe 0 java hashmap

好的,我有一个面试编码问题,问题表明在一个循环中我必须找到一个非重复字符的第一个实例.因此,例如,如果字符串是"abcab",它将返回c,因为a和b重复.

我有以下内容遍历整个字符串,并输入发生在哈希映射中的字符数量,它的工作原理.

private static  boolean findFirstCharacter(String s) {
     HashMap<Character, Integer> map = new HashMap<Character, Integer>();

       for(int i = 0; i < s.length(); i++) {
           char c = s.charAt(i);
            if(!map.containsKey(c)){
                map.put(c,1);

            }else{
               int value =  map.get(c);
               value++;
               map.put(c,value);


            }



        }


}
Run Code Online (Sandbox Code Playgroud)

现在显然我可以再次迭代并找到键值为1的第一个实例,但它必须是一个循环.无论如何,根据我所拥有或正在接近这个错误,这样做是否仍然存在?

And*_*eas 5

这是在单个循环中执行此操作的一种方法.

该方法可以处理来自辅助平面的Unicode字符,并且已被修改为返回第一个非重复字符,而不是a boolean.

注意:代码需要Java 8+.

private static String findFirstCharacter(String s) {
    Set<Integer> singles = new LinkedHashSet<>(), duplicates = new HashSet<>();
    s.codePoints().forEach(ch -> {
        if (! duplicates.contains(ch) && ! singles.add(ch)) {
            singles.remove(ch);
            duplicates.add(ch);
        }
    });
    return (singles.isEmpty() ? null : new String(new int[] { singles.iterator().next() }, 0, 1));
}
Run Code Online (Sandbox Code Playgroud)

测试

System.out.println(findFirstCharacter("abcab"));
System.out.println(findFirstCharacter("abcbca"));
System.out.println(findFirstCharacter(""));
Run Code Online (Sandbox Code Playgroud)

产量

c
null

Run Code Online (Sandbox Code Playgroud)

  • 很好的想法处理代码点.您的代码在Java 8顺便说一下运行良好.您可以通过使用一组唯一字符和所有字符而不是唯一和重复来简化它(如[我的答案](/sf/answers/3588781311/),但使用代码点而不是char值). (2认同)