我现在一直在尝试大多数事情,但它似乎并没有起作用。如果用户输入特定名称,我想从Arraylist中删除特定对象。如果不是,我希望程序打印"找不到狗"。我在我的另一个类中有一个getName和toString方法,它与我在此程序中的所有其他选项一起使用,这是唯一不起作用的方法。
案例4是应该进行删除的地方。但我也希望你看一下案例3来比较案例3打印出来"无法找到狗"无论如何,案例4打印出来"无法找到狗"和对象一样多次。
这是主要方法:
ArrayList<Dog> doglist = new ArrayList<Dog>();
Scanner myscan = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\n************************************");
System.out.println("\nVälkommen till Kennelklubben!");
System.out.println("\n************************************");
System.out.println("\n[1] Register new dog");
System.out.println("[2] Print out list");
System.out.println("[3] Increase age");
System.out.println("[4] Remove dog");
System.out.println("[5] Quit program");
System.out.println("\n************************************");
System.out.println("\nChoose: ");
int option = myscan.nextInt();
switch (option) {
case 1:
System.out.println("Write name:");
String name = myscan.next();
System.out.println("Write race:");
String race = myscan.next();
System.out.println("Age:");
int age = myscan.nextInt();
System.out.println("Weight:");
double weight = myscan.nextDouble();
Dog dog = new Dog(name, race, age, weight);
doglist.add(dog);
break;
case 2:
System.out.println("Minimum length of tail:");
double userInput1 = myscan.nextDouble();
for (Dog d : doglist) {
if (d.getTailLength() >= userInput1) {
System.out.println(d.toString());
} else {
System.out.println("Can't find dog");
}
}
break;
case 3:
System.out.println("Name of dog:");
String userInput2 = myscan.next();
for (Dog d : doglist) {
if (d.getName().equals(userInput2)) {
d.increaseAge();
break;
}
}
System.out.println("Can't find dog");
break;
case 4:
System.out.println("Name of dog:");
String userInput3 = myscan.next();
for (Dog d : doglist) {
if (d.getName().equals(userInput3)) {
doglist.remove(d.toString());
} else {
System.out.println("Can't find dog");
}
}
break;
case 5:
running = false;//Avslutar loopen och därmed programmet
System.out.println("Programmet avslutat");
break;
default:
System.out.println("Nu blev det fel, välj mellan [1] [2] [3] [4] [5]");//Felmeddelande om valet är någon annan siffra än de som menyn innehåller
break;
}
}
这是我的方法的另一个类
public class Dog
{
private String name;
private String race;
private int age;
private double weight;
private double tailLength;
public Dog (String name, String race, int age, double weight)
{
this.name = name;
this.setRace(race);
this.age = age;
this.weight = weight;
if(race.equals("tax"))
{
this.setTailLength(3.7);
}
else
{
this.setTailLength((age - weight) / 10);
}
}
public String getRace()
{
return race;
}
public void setRace(String race)
{
this.race = race;
}
public double getTailLength()
{
return tailLength;
}
public void setTailLength(double tailLength)
{
this.tailLength = tailLength;
}
public int increaseAge()
{
age++;
return age;
}
public String toString()
{
return name + " " + getRace() +
" " + age + " " + "år" + " " + weight + " " + "kg" + " " + getTailLength();
}
public String getName()
{
return name;
}
}
答案 0 :(得分:2)
为了清楚起见,这是你现在所拥有的:
System.out.println("Name of dog:");
String userInput3 = myscan.next();
for(Dog d : doglist)
{
if(d.getName().equals(userInput3))
{
doglist.remove(d.toString());
}
else
{
System.out.println("Can't find dog");
}
}
break;
dogList
是ArrayList<Dog>
。
ArrayList.remove()
的{{3}}:
从此列表中删除指定元素的第一个匹配项(如果存在)。如果列表不包含该元素,则不会更改。
在这里,您使用参数remove()
呼叫d.toString()
。 d
是您要删除的Dog的实例。 d.toString()
会返回String
。
因此dogList.remove(d.toString())
会尝试从列表中删除String
。显然,String
不在列表中,因为它是Dog
的列表。找不到String
,也不会删除任何内容。
正如文档所说,您需要传递要删除的实例。您需要致电doglist.remove(d)
。但是,这会导致错误,因为在迭代时无法从列表中删除项目。
因此,您需要将Dog
实例存储在临时变量中,并在迭代后将其删除。
这样的事情会起作用:
Dog dogToRemove = null;
for (Dog d: dogList) {
if (d.getName().equals(userInput3)) {
dogToRemove = d;
}
}
if (dogToRemove == null) {
System.out.println("Could not find dog with name " + userInput3);
} else {
dogList.remove(dogToRemove);
}
请注意,还有其他方法可以执行此操作,这只是其中之一。我鼓励您找到替代方案,以便了解其效果如何。
答案 1 :(得分:1)
案例3:
尝试添加其他内容并在其中添加消息
System.out.println("Name of dog:");
String userInput2 = myscan.next();
for (Dog d : doglist) {
if (d.getName().equals(userInput2)) {
d.increaseAge();
break;
}
else {
System.out.println("Can't find dog");
}
}
break;
对于案例4:您可以按索引删除
System.out.println("Name of dog:");
String userInput3 = myscan.next();
for (Dog d : doglist) {
if (d.getName().equals(userInput3)) {
doglist.remove(doglist.indexOf(d));
} else {
System.out.println("Can't find dog");
}
}
break;
答案 2 :(得分:1)
使用Java 8可以有更好的方法。
doglist = doglist.stream().filter(dog -> !dog.getName().equals(userInput3)).collect(toList());
一行代码,易读,无移动部件
如果你没有找到狗,如果你想要一条消息,那么:
if (doglist.stream().anyMatch(dog -> dog.getName().equals(userInput3)){
doglist = doglist.stream().filter(dog -> !dog.getName().equals(userInput3)).collect(toList());
} else {
System.out.println("Can't find dog");
}