尝试返回哈希表中出现奇数次的所有数字,我已经评论了坏线。
基本上我希望代码通过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);
}
}
答案 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