0

下面的方法(generateID())它生成一个随机id,当我将学生存储在其中时,HashMap我想检查生成的id是否在hashMap值中不存在,如果它存在我想生成一个新的id然后存储它,方法存储的问题有时它不会存储所有学生,因为某些学生可能具有相同的 id,这是不允许的,那么最好的方法是为什么检查所有 id 都是唯一的,如果有重复,方法 generateid 将是再次调用 util 所有的 ids 都是 uniqe 然后它会存储它,我想确保产生的 ids 值generateId()都是不同的

 private String generateId(String perfix, int numberaOfDigits)
    {
        for(int i=0;i<numberaOfDigits;i++)
        {
            perfix +=  randomGenerator.nextInt(9)+ 1; 

        }
        return perfix;
    }



 public void store(Student student) 
    {   

        int index = 0;


            studentMap.setId(generateId("AB-",1));

            while(index <= studentMap.size())

            {
                for(Student stu : studentMap.values() )

                {
                    if(student.getStduentID().equals(stu.getStduentID()))

                    {
                        student.setId(generateId("AB-",1));
                    } 

                }
                index++;
            }
        }
        studentMap.put(student.getStduentID(),student);

    }
4

6 回答 6

1

您可以使用该containsKey()方法检查 ID 是否已用作密钥

于 2013-04-16T12:21:01.357 回答
0

您可以get使用生成的 Id 从地图中返回,如果它返回null,则它尚不存在。

Map<Long, Object> myMap = new HashMap<Long, Object>();
Long id = generateRandomId()
Object value = getMyObjectValue();

while(myMap.get(id) != null){
    id = generateRandomId();
}

myMap.put(id, value);
于 2013-04-16T12:20:54.607 回答
0

使用 UUID。或者已经回答的序列

于 2013-04-16T12:21:21.350 回答
0

如果这实际上是一个 Map 实现,您应该能够使用 .containsKey()。问题是,根据您的 ID 生成器的编写程度,随着时间的推移,这可能会导致严重的性能问题。假设您有一个 6 位数的 ID,并且在几年内有 80000 名学生通过了该系统。它需要多少次猜测才能找到剩余的 20000 个可用密钥之一?

于 2013-04-16T12:22:38.113 回答
0

我建议尝试以下实现以每次获取唯一的随机数。

  1. 将项目添加到列表中。
  2. 用于Collections.shuffle(list);随机播放列表。
  3. 遍历列表并每次从给定范围内获取随机数。(对于以下情况,范围是从 0 到 numberOfStudent-1)。

    int numberOfStudent = 10;
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < numberOfStudent; i++) 
        list.add(i);    
    
    Collections.shuffle(list);
    
于 2013-04-16T12:26:02.867 回答
0

我将generateId()完全消除该方法,只需执行以下操作:

private int id;

然后:

student.setId(id++);
于 2013-04-16T12:32:41.787 回答