gpt4 book ai didi

java - 迭代 HashMap 并创建唯一的对象 - 试图防止重复

转载 作者:行者123 更新时间:2023-12-01 14:59:22 26 4
gpt4 key购买 nike

我在方法中各部分上方的注释中解释了我想要做什么:

public int addPatron(String name) throws PatronException {
int i = 0;
//1. Iterate through a hashmap, and confirm the new name I am trying to add to the record doesn't already exist in the hashmap
for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
Patron nameTest = entry.getValue();
//2. If the name I am trying to add already exists, we want to throw an exception saying as much.
if (nameTest.getName() == name) {
throw new PatronException ("This patron already exists");
//3. If the name is unique, we want to get the largest key value (customer number) already in the hash, an increment by one.
} else if (nameTest.getName() != name) {
Map.Entry<Integer,Patron> maxEntry = null;
for(Map.Entry<Integer, Patron> entryCheck : patrons.entrySet()) {
if (maxEntry == null || entryCheck.getKey() > maxEntry.getKey()) {
maxEntry = entryCheck;
i = maxEntry.getKey();
i++;
}
}

} else {
throw new PatronException("Something's not working!");
}
//4. If everything is ok up to this point, we want to us the name and the new customer id number, and use those to create a new Patron object, which then gets added to a hashmap for this class which contains all the patrons.
Patron newPatron = new Patron(name, i);
patrons.put(i, newPatron);
}
return i;
}

当我尝试运行一个简单的单元测试时,如果我连续两次成功为 addPatron 添加相同的名称,该测试就会失败,测试失败。

try {
testLibrary.addPatron("Dude");
testLibrary.addPatron("Dude");
fail("This shouldn't have worked");

测试失败,告诉我 addPatron 方法可以使用相同的名称两次。

@乔恩斯基特:

我的赞助人类(class)如下所示:

public class Patron {

//attributes
private String name = null;
private int cardNumber = 0;

//operations
public Patron (String name, int cardNumber){
this.name = name;
this.cardNumber = cardNumber;
}

public String getName(){
return name;

}

public int getCardNumber(){
return cardNumber;
}

}

最佳答案

正如其他人所说,使用 == 来比较字符串几乎肯定是不合适的。但是,它实际上不应该在您的测试用例中引起问题,因为您两次使用相同的常量字符串,因此 == 应该有效。当然,您仍然应该修复代码以使用equals

也不清楚 Patron 构造函数或 getName 方法的作用 - 其中任何一个都可能导致问题(例如,如果它们创建一个 字符串的副本 - 这会导致您的测试失败,但通常也是不必要的)。

让我更担心的是这个评论:

// 3. If the name is unique, we want to get the largest key value (customer number) 
// already in the hash, an increment by one.

此注释位于主​​循环内。因此,到那时我们不知道该名称是唯一的 - 我们只知道它与本次迭代中订阅者的名称​​不匹配

更令人担忧的是 - 我刚刚注意到这一点 - 您也在迭代 block 中执行添加操作。在我看来,你应该有更多类似这样的东西:

public int addPatron(String name) throws PatronException {
int maxKey = -1;

for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
if (entry.getValue().getName().equals(name)) {
// TODO: Consider using IllegalArgumentException
throw new PatronException("This patron already exists");
}
maxKey = Math.max(maxKey, entry.getKey());
}
int newKey = maxKey + 1;
Patron newPatron = new Patron(name, newKey);
patrons.put(newKey, newPatron);
return newKey;
}

此外,听起来您真的想要一张从名字到赞助人的 map ,可能还需要 id 到赞助人的 map 。

关于java - 迭代 HashMap 并创建唯一的对象 - 试图防止重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896528/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com