计算数组中的唯一值 (Java)
Counting unique values in an array (Java)
之前有人问过,我知道,但我真的不知道为什么我的代码不起作用。我试图找出未定义数组中有多少个唯一值。 (即 {0, 0, 1, 1, 1, 5, 5, 6, 6, 7} 应该 return 值为 5。这就是我目前所拥有的:
public static int numUnique(double[] list) {
int counter = 0;
for(int i = 0; i < list.length; i++) {
for(int j = i + 1; j < list.length; j++) {
if(list[i] != list[j])
counter ++;
}
}
return counter;
}
假设数组已排序,您应该只检查每个元素是否不等于紧随其后的元素。计数器也应初始化为 1
,因为如果所有元素都相同,则唯一元素的数量为 1
。我们还需要添加对 null
或空数组的检查,其结果为 0
。 (如果没有排序,你可以使用Arrays.sort
来排序,但这不是最快的方法。)
public static int numUnique(double[] list) {
if(list == null || list.length == 0) return 0;
int counter = 1;
for(int i = 1; i < list.length; i++)
if(list[i - 1] != list[i]) ++counter;
return counter;
}
替代方法包括使用 Stream#distinct
或 Set
,它们不依赖于顺序 *.
System.out.println(java.util.Arrays.stream(array).distinct().count());
或
System.out.println(java.util.stream.IntStream.of(array).distinct().count());
* LinkedHashSet
实现为您提供了可预测的迭代顺序。
如果输入数组按照您的示例排序,则不需要嵌套循环:
public static int numUnique (double[] list) {
if (null == list || 0 == list.length) {
return 0;
}
int counter = 1;
for (int i = 1; i < list.length; i++) {
if (list[i] != list[i - 1]) {
counter ++;
}
}
return counter;
}
可以使用 Stream API、函数 distinct
和 count
来实现相同的结果(输入数组不需要排序):
public static int numUniqueStream (double ... list) {
if (null == list) {
return 0;
}
return (int) Arrays.stream(list).distinct().count();
}
之前有人问过,我知道,但我真的不知道为什么我的代码不起作用。我试图找出未定义数组中有多少个唯一值。 (即 {0, 0, 1, 1, 1, 5, 5, 6, 6, 7} 应该 return 值为 5。这就是我目前所拥有的:
public static int numUnique(double[] list) {
int counter = 0;
for(int i = 0; i < list.length; i++) {
for(int j = i + 1; j < list.length; j++) {
if(list[i] != list[j])
counter ++;
}
}
return counter;
}
假设数组已排序,您应该只检查每个元素是否不等于紧随其后的元素。计数器也应初始化为 1
,因为如果所有元素都相同,则唯一元素的数量为 1
。我们还需要添加对 null
或空数组的检查,其结果为 0
。 (如果没有排序,你可以使用Arrays.sort
来排序,但这不是最快的方法。)
public static int numUnique(double[] list) {
if(list == null || list.length == 0) return 0;
int counter = 1;
for(int i = 1; i < list.length; i++)
if(list[i - 1] != list[i]) ++counter;
return counter;
}
替代方法包括使用 Stream#distinct
或 Set
,它们不依赖于顺序 *.
System.out.println(java.util.Arrays.stream(array).distinct().count());
或
System.out.println(java.util.stream.IntStream.of(array).distinct().count());
* LinkedHashSet
实现为您提供了可预测的迭代顺序。
如果输入数组按照您的示例排序,则不需要嵌套循环:
public static int numUnique (double[] list) {
if (null == list || 0 == list.length) {
return 0;
}
int counter = 1;
for (int i = 1; i < list.length; i++) {
if (list[i] != list[i - 1]) {
counter ++;
}
}
return counter;
}
可以使用 Stream API、函数 distinct
和 count
来实现相同的结果(输入数组不需要排序):
public static int numUniqueStream (double ... list) {
if (null == list) {
return 0;
}
return (int) Arrays.stream(list).distinct().count();
}