繁体   English   中英

检查号码是否已经存在

[英]Checking if number already exists

我正在生成一个40到50之间的随机数。生成该数字后,将其打印到屏幕上,然后将其添加到ArrayList 但是,如果该数字已存在于ArrayList那么我将显示一条消息"This number already exists in Array List" 因此,该代码永远不应打印两次相同的数字。 但是由于某种原因,即使数组列表中存在相同的数字,它也会打印两次相同的数字。 我不确定我在做什么错

import java.util.ArrayList;
import java.util.Random; 

public class RandomNumber {

    Random random = new Random(); 
    int x;
    int l;
    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low) {
        x = random.nextInt(high-low)+low;
        ArrayList<Integer> arl = new ArrayList<Integer>();


        if(!arl.contains(x)) {
            System.out.println(x);
            arl.add(x);

        } else if (arl.contains(x)) {
            System.out.println("This is already in ArrayList");
        }
    }
}

代码中的逻辑已损坏。

首先,当您检查if(!arl.contains(x))arl为空,因此此条件始终为true。

更重要的是,如果您只想维护唯一数字,请使用Set而不是List 并且此集合应该是global ,即在genNumber方法外部声明。 下面的代码应该可以工作(未经测试,我保留了原始数据结构)。

import java.util.ArrayList;
import java.util.Random; 

public class RandomNumber {

    Random random = new Random(); 
    int x;
    int l;
    ArrayList<Integer> arl;

    public RandomNumber() {
        arl = new ArrayList<>();
    }

    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low){
        x = random.nextInt(high-low)+low;
        if(!arl.contains(x)) {
            System.out.println(x);
            arl.add(x);
        } else {
            System.out.println("This is already in ArrayList");
        }
    }
}

您需要使ArrayList成为一个字段,而不是局部变量。 这样,可以在方法调用之间重用它(只要您使用相同的RandomNumber实例)。 在您当前的实现中,跟踪已生成数字的ArrayList在方法末尾被丢弃。

这有效:

import java.util.ArrayList;
import java.util.Random;

public class RandomNumber {

    Random random = new Random();
    int x;
    int l;
    ArrayList<Integer> arl = new ArrayList<Integer>();

    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);

        //r = new RandomNumber(); // created a new one - uncommenting this line will mean the List is lost and we will generate duplicates.
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low){
        x = random.nextInt(high-low)+low;

        if(!arl.contains(x)){
            System.out.println(x);
            arl.add(x);

        }else if(arl.contains(x)){
            System.out.println("This is already in ArrayList");
        }
    }
}

实际上,我认为您误会了错误。 每次调用您的方法时,您都在创建一个全新的ArrayList,因此它始终以空开头。 因此,向其添加随机数没有问题。

要解决此问题,您需要将arl移出该方法,以便仅创建一次即可继续使用,直到应用程序完成(或直到您完成存储随机数)为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM