Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在用户输入的数组中查找唯一值的数目_Java_Arrays - Fatal编程技术网

Java 在用户输入的数组中查找唯一值的数目

Java 在用户输入的数组中查找唯一值的数目,java,arrays,Java,Arrays,我正在尝试编写一个方法,该方法接受整数数组并返回该数组中唯一值的数目。例如,对于数组{5,6,5,7,5,7},该方法返回3,因为有3个重复项(5,5,7)。我不确定哪里出错了,我尝试创建一个变量list,这样当我调用numinique(list)时,它会给出我的答案,但这似乎不起作用。有什么建议吗 代码: import java.util.Scanner; 公共类唯一值{ 公共静态void main(字符串[]args){ 扫描仪sc=新的扫描仪(System.in); int n=sc.ne

我正在尝试编写一个方法,该方法接受整数数组并返回该数组中唯一值的数目。例如,对于数组{5,6,5,7,5,7},该方法返回3,因为有3个重复项(5,5,7)。我不确定哪里出错了,我尝试创建一个变量
list
,这样当我调用
numinique(list)
时,它会给出我的答案,但这似乎不起作用。有什么建议吗

代码:

import java.util.Scanner;
公共类唯一值{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt();
int[]列表=新的int[n];
System.out.printf(“%d%n”,列表);
}
公共静态int numUnique(int[]列表){
如果(list.length==0){
返回0;
}否则{
整数计数=1;
for(int i=1;i
这不是解决问题的代码,因为我认为思考这个问题很重要

一种暴力方法是创建一个列表,让我们称之为returnList,并在读入元素时将元素添加到该列表中。每次要向列表中添加元素时,首先应检查列表,以确保之前未添加该元素。如果以前添加过,则不会将该元素添加到列表中,然后移动到下一个输入元素中。在读取整个数组后,简单地返回returnList的长度,这是很容易做到的

请注意,这绝不是一种有效的方法(要求您每次都检查列表),而只是解决此问题的一种方法。我敦促你尝试并思考更好的方法来解决这个问题


祝你好运

您的代码将
列表[i]
列表[i-1]
进行比较,这意味着您只检查相邻的重复项。要过滤掉所有重复项,您需要使用一个内循环对每个连续元素检查
list[i]
。例如:

int count = 1;
for (int i = 0; i < list.length - 1; i++) {
    for (int j = i + 1; j < list.length && list[i] != list[j]; j++) {
        if (j == list.length - 1) {
            count++;
        }
    }
}
int count=1;
对于(int i=0;i
请注意,有许多方法可以表述上述内容,并且与注释中提到的使用内部循环相比,有更干净、更有效的方法来计算不同元素。

您的代码
if(list[i]!=list[i-1]){count++;}
只检查相邻的重复项。因此,在数组[5,4,5]中,这两个5不会被视为重复

解决此问题的一种方法是使用蛮力方法,即嵌套for循环,内部for循环穿过完整的剩余数组

在我看来,更好的方法是扫描数组,并在集中不断插入值。扫描完成后,集合的长度就是您的答案(唯一值的数量)

在Java中,考虑到输入是一个整数列表,可以使用以下代码:

public static int findNumberOfUniqueElements(List<Integer> list) {
    if (list == null) {
        return 0;
    }
    return (new HashSet<Integer>(list)).size();
}
public static int findNumberOfUniqueElements(列表){
if(list==null){
返回0;
}
return(新HashSet(list)).size();
}
以下是适用于任何语言的更通用的代码:

public static int findNumberOfUniqueElements(List<Integer> list) {
    if (list == null) {
        return 0;
    }
    Set<Integer> set = new HashSet<Integer> ();
    for (int i=0; i<list.size(); i++) {
        set.add(list.get(i));   // get list[i]
    }
    return set.size();
}
public static int findNumberOfUniqueElements(列表){
if(list==null){
返回0;
}
Set=newhashset();

对于(int i=0;i如果只想使用数组

要查找重复项的计数,需要首先对数组进行排序,然后比较相邻元素,如果两者相同,则增加计数

代码如下:

public static int numUnique(int arr[])
{
    int dup = 0;

    Arrays.sort(arr);

    for(int i = 1 ; i < arr.length ; i++)
    {
        if(arr[i-1] == arr[i])
            dup++;
    }
    return dup;
}
public static int numinique(int arr[])
{
int-dup=0;
数组。排序(arr);
对于(int i=1;i
使用ArrayList有一种相对简单的方法

代码如下:

public static int numUnique(int arr[])
{
    int dup = 0;

    ArrayList<Integer> al = new ArrayList<Integer>();

    for(int i = 0 ; i < arr.length ; i++)
    {
        if(!al.contains(arr[i]))
        {
            al.add(arr[i]);
        }
        else
            dup++;
    }
    return dup;
}
public static int numinique(int arr[])
{
int-dup=0;
ArrayList al=新的ArrayList();
对于(int i=0;i
“这似乎不起作用”不是一个清晰的问题描述。您的输入是什么?您期望的输出是什么?您的方法只检查相邻的重复项。您需要一个内部循环。您只检查数字前面的元素,例如:
4545
您正在比较
5
4
而不是
5
5
。您需要将数组中的每个数字与所有其他数字进行比较。您可以使用内部循环来完成此操作…仅供参考,您可以非常轻松地使用流来完成此操作:
return array.stream(list).distinct().count()
或只是将所有内容添加到
集合
中,然后对其条目进行计数,la为什么要使用列表而不是集合?同样,这不是唯一的实现,旨在给出一个非理想的算法,迫使OP思考如何提供更好的时间复杂度/效率。我同意你的观点,集合是解决问题的方法我想让奥普自己试着弄明白这一点!:)
public static int numUnique(int arr[])
{
    int dup = 0;

    ArrayList<Integer> al = new ArrayList<Integer>();

    for(int i = 0 ; i < arr.length ; i++)
    {
        if(!al.contains(arr[i]))
        {
            al.add(arr[i]);
        }
        else
            dup++;
    }
    return dup;
}