我刚刚开始了Java Data Structures夏季课程。分配的问题之一是不是计算数组中的所有元素,而是要找到每个唯一元素。
numUnique(new double[] { 11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88 })==8
numUnique(new double[] { 11, 22, 33, 44, 55, 66, 77, 88})==8
在上面的第一个例子中,列出了11次,22次,33次,44次,66次,77次,88次,88次。数组中有17个元素,但只有8个不同的数字。这两个例子给出了8的相同输出,这就是我应该找到的数字。
答案 0 :(得分:4)
在没有任何中间集合的Java 8中,这是一个很好的简单方法:
List<Double> unique = Arrays.stream(array).distinct()
.collect(Collectors.toList());
或者如果您只想要唯一元素的数量,请用count()
替换收集器。
答案 1 :(得分:1)
执行此操作的两种简单方法是将数组添加到集合中(根据定义将删除重复项),或使用数字作为键将每个数字添加到散列映射。
使用集合:
double[] input = new double[] {11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88};
Set<Double> set = new HashSet<Double>(Arrays.asList(input));
System.out.println("There were " + set.size() + " unique numbers in the set.");
使用地图:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i < double.length; ++i) {
map.put(i, null);
}
System.out.println("There were " + map.keySet.size() + " unique numbers in the set.");
答案 2 :(得分:0)
在Java中跟踪唯一项的最简单方法之一是使用HashMap实现。
您需要的API是:containsKey()和put()。已阅读下面的API文档。 https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
示例实施:
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) {
double[] value1 = new double[] { 11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88 };
Map<Double, Integer> numberTracker = new HashMap<>();
for(Double value : value1) {
if (!numberTracker.containsKey(value)) {
numberTracker.put(value, /*dummy value=*/1);
}
}
for (Map.Entry<Double,Integer> entry : numberTracker.entrySet()) {
System.out.println(entry.getKey());
}
}
}
注意:因为你有一个双数组,所以输出将是双数据类型。也就是说,它会是这样的; [33.0,66.0,77.0,11.0 ......]
您可以通过将数组更改为Integer类型或找到将double值转换为整数的方法来解决double类型问题。
因为这应该是一个作业问题,我会留给你最后一点。