在 Java 中没有 O(n) 操作的情况下防止 java 中的字符串重复的好方法?

A good way to prevent string repeats in java without O(n) operations in Java?

这是一个假设的情况:您希望自动为唯一的昵称分配唯一的昵称,不重复。由于昵称包含的文本信息少于原始名称,这是昵称的性质,因此不能保证彼此唯一的两个名称也将产生唯一的昵称。为了解决这个问题,我想在末尾加上一个数字,保证昵称独一无二。但是,我觉得我这种幼稚的做法有点可怕,我想学习一下知道自己在做什么的人会怎么做。

private static final List<String> nicknames = new ArrayList<String>();
// ...
String fullName = "a cool test name";
String base = getNickname(fullName); // -> "ACTN"
String nick = base;
int numAdd = 0;
Predicate<String> within = ((String s) -> {
    for (String os : nicknames) {
        if (os.equalsIgnoreCase(s)) return true;
    }
    return false;
});
while (within.test(nick)) {
    numAdd++;
    nick = base + numAdd;
}
// nick is now a unique string

就我个人而言,我讨厌 while 循环,我觉得自己有点笨,因为我自己想不出解决办法。也许存储以基数开头然后是一些数字的字符串,然后找到其中的最大数并加 1?这听起来会占用大量内存,然后如果例如有“ACTN3、ACTN4、ACTN5”然后删除“ACTN4”,则会错误地为新前缀分配“ACTN6”。

将昵称以小写形式存储在映射中,并将下一个免费号码作为值,或者在没有添加号码后缀时为 0。

Map<String, Integer> nicknames = new HashMap<>();
String base = getNickName();

// String trailing number:
String realBase = base.replaceFirst("(^.*?)\d+$", "");

realBase = realBase.toLowerCase(Locale.US);
int suffix = nicknames.getOrDefault(realBase, 0);
nickNames.put(realBase, suffix + 1);
String nickname = realBase;
if (suffix != 0) {
    realBase = realBase + suffix;
}

上面去掉了原昵称末尾的数字。 所以不允许选择 february29.