想要遍历hashTable键,使用keys()或keySet()?

时间:2014-12-22 12:19:45

标签: java hashtable

尝试返回哈希表中出现奇数次的所有数字,我已经评论了坏线。

基本上我希望代码通过int数组并将其分配给哈希表的键,如果它再次出现(偶数次),make boolean false,如果它出现奇数次,则boolean将为真。然后我需要迭代哈希表的键并返回布尔值为true的键。

package practice;

import java.util.*;
/*

You are given an integer array, where all numbers except for TWO numbers appear even number of times. 

Q: Find out the two numbers which appear odd number of times.

*/

public class hashTable{
public static void main(String[] args){
    int[] test = {2, 2, 5, 7, 4, 4};
    List<Integer> solution = new ArrayList<Integer>();
    Hashtable<Integer, Boolean> ht = new Hashtable<Integer, Boolean>(); 
    Boolean check = true;
    for (int item : test){
        if (!ht.containsKey(item)){
            check = true;
        } else{
            check = false;
            ht.put(item, check);
        }
        }

    for (int item : ht.keySet()){
        if (ht.get(item) == true){
            solution.add(item);
        }
        }
    System.out.println("the result is");
    System.out.println(solution);
    }

 }

5 个答案:

答案 0 :(得分:0)

keys()方法将该组键作为枚举返回。

keySet()方法将键集作为Set对象返回。

!ht.containsKey(item)不会是真的,所以这个check = true;和你的ht将是空的。

因此,无论ht条件如何,您都需要首次将值添加到if

答案 1 :(得分:0)

ht总是空的:当你遍历test时,containsKey总是false,所以你永远不会插入ht。

你根本没有正确构建。

答案 2 :(得分:0)

如果该项为true,则永远不会将该项置于哈希表中。

for (int item : test){
    if (!ht.containsKey(item)){
        check = true;
    } else{
        check = false;
        ht.put(item, check);
    }
    }

应该是

for (int item : test){
    if (!ht.containsKey(item)){
        check = true;
    } else{
        check = false;
    }
        ht.put(item, check);
    }

答案 3 :(得分:0)

工作代码

import java.util.*;
/*

You are given an integer array, where all numbers except for TWO numbers appear even number of times. 

Q: Find out the two numbers which appear odd number of times.

*/

public class hashTable{
public static void main(String[] args){
    int[] test = {2, 2, 5, 7, 4, 4};
    List<Integer> solution = new ArrayList<Integer>();
    Hashtable<Integer, Boolean> ht = new Hashtable<Integer, Boolean>(); 
    Boolean check = true;
    for (int item : test){
        if (!ht.containsKey(item)){
            check = true;
        } else{
            System.out.println("else"+item);
            check = false;

        }
        ht.put(item, check);
        }
    for (int item : ht.keySet()){
        System.out.println("output"+item);
        if (ht.get(item) == true){
            solution.add(item);
        }
        }
    System.out.println("the result is");
    System.out.println(solution);
    }

 }

答案 4 :(得分:0)

如果您使用的是Java 8,则可以使用Streams解决问题。一个简短的解决方案是:

int[] test = {2, 2, 5, 7, 4, 4};

// Collect to a Map<Integer, List<Integer>>
Map<Integer, List<Integer>> m = 
    Arrays.stream(test).boxed().collect(Collectors.groupingBy(a -> a));

// Stream the map, filter out the odd ones and collect to a list
final List<Integer> odds = 
    m.entrySet().stream()
        .filter(e -> e.getValue().size() % 2 != 0)
        .map(e -> e.getKey())
        .collect(Collectors.toList());

或者,如果您更喜欢它作为&#34; oneliner&#34;

final List<Integer> odds =
        Arrays.stream(test)
                .boxed() // Create a stream of Integers
                .collect(Collectors.groupingBy(a -> a)) // Group by the key
                .entrySet().stream() // Create a stream of the entrySet
                .filter(e -> e.getValue().size() % 2 != 0) // Keep only the odd ones
                .map(e -> e.getKey()) // Convert Entry to an integer (the key)
                .collect(Collectors.toList()); // Collect it to a list