Java 根据给定的数字或字符串生成范围内的唯一数字

Java 根据给定的数字或字符串生成范围内的唯一数字,java,algorithm,random,sampling,Java,Algorithm,Random,Sampling,我想实现的是这样的,假设我们有一个1000个盒子的列表和一个25种颜色的列表,现在我们想给盒子分配颜色,这样颜色就来自给定的列表,每次我向盒子索要颜色时,都会选择相同的颜色。多个框可以使用相同的颜色,但无论执行算法多少次,同一框的颜色始终相同 我想我可以有一个25种颜色的列表和一个算法,根据盒子的名称或id在25范围内创建一个唯一的数字 谁能帮我一下什么算法适合我 更新 要求略有改变,现在我需要该范围内的五种独特颜色,并且颜色必须始终相同。假设我们将盒子分成五组,每个盒子的颜色应在25种颜色范围

我想实现的是这样的,假设我们有一个1000个盒子的列表和一个25种颜色的列表,现在我们想给盒子分配颜色,这样颜色就来自给定的列表,每次我向盒子索要颜色时,都会选择相同的颜色。多个框可以使用相同的颜色,但无论执行算法多少次,同一框的颜色始终相同

我想我可以有一个25种颜色的列表和一个算法,根据盒子的名称或id在25范围内创建一个唯一的数字

谁能帮我一下什么算法适合我

更新 要求略有改变,现在我需要该范围内的五种独特颜色,并且颜色必须始终相同。假设我们将盒子分成五组,每个盒子的颜色应在25种颜色范围内。算法应该始终为同一组指定相同的颜色

box.getId().hashCode() % 25
将为您提供一个介于0和24之间(含0和24)的数字

请注意,由于您没有为方框之间的颜色分布指定任何规则,因此以下算法也满足您的要求:

return 0;
如果您想要一个好的分布,那么迭代遍历您的框,并填充一个映射,其中键是框id,值是颜色:

Map<String, Integer> colorsByBoxId = new HashMap<String, Integer>();
int i = 0;
for (Box box : boxes) {
    int colorIndex = i % 25;
    i++;
    colorsByBoxId.put(box.getId(), colorIndex);
}
然后每次你想得到一个盒子的颜色时都使用这个贴图

或者简单地执行相同的操作,并向Box类添加颜色字段

将为您提供一个介于0和24之间(含0和24)的数字

请注意,由于您没有为方框之间的颜色分布指定任何规则,因此以下算法也满足您的要求:

return 0;
如果您想要一个好的分布,那么迭代遍历您的框,并填充一个映射,其中键是框id,值是颜色:

Map<String, Integer> colorsByBoxId = new HashMap<String, Integer>();
int i = 0;
for (Box box : boxes) {
    int colorIndex = i % 25;
    i++;
    colorsByBoxId.put(box.getId(), colorIndex);
}
然后每次你想得到一个盒子的颜色时都使用这个贴图


或者简单地做同样的事情,在Box类中添加一个颜色字段。

感谢您的回复,很明显我想要良好的分布,希望所有25种颜色都能使用。按照您的建议创建地图是不可行的,因为我们无法在内存中加载数千个对象。您有一个包含1000个框的列表。这将导致一个很小的地图,在内存中只有几个KBs。但如果这太多,那么请确保您的ID分布良好,并使用ID的哈希代码。这只是我试图解决的问题的一个例子,但实际上,它不是box,它是一些其他实体,我们有数千条记录。是的,我认为db id%25也应该工作,不是吗?如果id是一个序列号,每次创建一个新框时递增1,那么您将拥有一个完美的分布。如果它是一个数字,每次创建一个新的长方体时增加25,那么分布将很糟糕,因为模将始终返回相同的值。如果它是一个随机UUID,您可以希望得到一个良好的分发。但是,为什么不在每次创建并存储到数据库中时为长方体指定一个随机颜色呢?ID会增加一个-是的,存储颜色也不应该是一个问题。感谢您的回复,显然我想要良好的分布,希望所有25种颜色都能使用。按照您的建议创建地图是不可行的,因为我们无法在内存中加载数千个对象。您有一个包含1000个框的列表。这将导致一个很小的地图,在内存中只有几个KBs。但如果这太多,那么请确保您的ID分布良好,并使用ID的哈希代码。这只是我试图解决的问题的一个例子,但实际上,它不是box,它是一些其他实体,我们有数千条记录。是的,我认为db id%25也应该工作,不是吗?如果id是一个序列号,每次创建一个新框时递增1,那么您将拥有一个完美的分布。如果它是一个数字,每次创建一个新的长方体时增加25,那么分布将很糟糕,因为模将始终返回相同的值。如果它是一个随机UUID,您可以希望得到一个良好的分发。但是为什么不在每次创建并存储到数据库中时为长方体指定一个随机颜色呢?ID会增加一个-是的,存储颜色也不成问题。