开发者社区> 问答> 正文

列表中的唯一编号

您好,我有一个产生1000万员工的问题。每个人都必须具有唯一的ID号。

List<Employee> employeesL = new LinkedList<>();

for (var i = 0; i < 1000000; i++) {
        Employee employeeObject = new Employee();
        employeeObject.setId(Math.abs(gen.nextLong()));
        .
        .
        .
        employeesL.add(employeeObject);
        }

是否有可能比简单的while循环做得更好。我喜欢这样的东西:

public static void uniqueAdd(List<Employee> employees, Employee employee)
    {
        Random gen = new Random();
        employee.setId(Math.abs(gen.nextLong()));

        while (employees.contains(employee.getId())) {
            employee.setId(Math.abs(gen.nextLong()));
        }
    }

唯一的问题是,用这种方法永远需要大量的员工。我也不能使用简单的迭代ID ++

编辑:我需要创建uniqueAdd方法!我的教授给我建议,我可以使用Set,例如HashSet

问题来源:Stack Overflow

展开
收起
montos 2020-03-24 09:40:12 737 0
1 条回答
写回答
取消 提交回答
  • employees.contains(employee.getId())每次添加ID时都要进行检查,这是一种无效的方法。最简单的方法是在中创建static变量Employee并获取下一个ID,如下所示:

    private static int id = 0;
    
    public static int nextId() {
       return ++id;
    }
    

    然后,

    for (var i = 0; i < 1000000; i++) {
        Employee employeeObject = new Employee();
        employeeObject.setId(Employee.nextId());
        .
        .
        .
        employeesL.add(employeeObject);
    }
    

    您甚至可以id按如下所示在构造函数中分配:

    this.id = nextId();
    

    这样,您employeeObject.setId(Employee.nextId())在创建Employee对象时不必调用,并且id将自动为该对象分配一个唯一性。

    或者,

    填充列表后employeesL,您可以使用以下机制设置id。

    Set<Integer> idSet = new HashSet<Integer>();
    Random random = new Random();
    while (idSet.size() != 10000000) {
        idSet.add(random.nextInt(Integer.MAX_VALUE));
    }
    System.out.println("10000000 unique IDs generated");
    
    int i = 0;
    for (Integer id: idSet) {
        employeesL.get(i).setId(id);
        i++;
    }
    

    如有任何疑问/问题,请随时发表评论。

    回答来源:Stack Overflow

    2020-03-24 09:41:27
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载