gpt4 book ai didi

Java - 从多个 ArrayList 中获取值

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:03 25 4
gpt4 key购买 nike

我有一些问题,想不出更多的解决方案。

我希望在用户尝试添加列表中的电影名称和剧院名称时显示结果,它会显示另一个用户输入(年、月、日、小时、分钟)。

但如果列表找不到任何名称/标题匹配,它会打印出“找不到您的电影或/和剧院。”

这是我到目前为止输入的代码。

public void addScreening() {
System.out.println("-ADD NEW SCREENING-");

String mTitle = Helper.readString("Enter movie title > ");
String tName = Helper.readString("Enter theatre name > ");

for (int i = 0; i < movies.size(); i++) {for (int j = 0; j < theatres.size(); j++) {
if ((movies.get(i).getTitle().contains(mTitle) && movies.get(i)
.getTitle() != null)
&& (theatres.get(j).getName().contains(tName) && theatres
.get(j).getName() != null)) {

int year = Helper.readInt("Enter year > ");
int month = Helper.readInt("Enter month > ");
int day = Helper.readInt("Enter day > ");
int hour = Helper.readInt("Enter hour > ");
int min = Helper.readInt("Enter min > ");

screenings.add(new MovieScreening(Helper.thisDate(year,
month, day, hour, min), movies.get(i), theatres
.get(j), 0));
System.out.println("Added successfully");
break;
} else if ((!movies.get(i).getTitle().contains(mTitle))
|| (!theatres.get(j).getName().contains(tName))) {
System.out
.println("Your movie or/and theatre cannot be found.");
break;
}
}
}
}

如果比较列表 [0] 中的第一个索引,这是可能的,但我似乎无法将它与其他索引进行比较。

假设电影和剧院名称有“a”和“b”。

电影名称:“a”、“b”

剧院名称:“a”、“b”

输出

-Add New Movie Screening-
Enter movie title > a
Enter theatre name > a
// User input
Added Successfully
Your movie or/and theatre cannot be found.
Your movie or/and theatre cannot be found.
-----------
-Add New Movie Screening-
Enter movie title > a
Enter theatre name > b
Your movie or/and theatre cannot be found.
Your movie or/and theatre cannot be found.
Your movie or/and theatre cannot be found.
-----------
-Add New Movie Screening-
Enter movie title > b
Enter theatre name > a
Your movie or/and theatre cannot be found.
// user input
Added successfully
Your movie or/and theatre cannot be found.
-----------
-ADD NEW SCREENING-
Enter movie title > b
Enter theatre name > b
Your movie or/and theatre cannot be found.
Your movie or/and theatre cannot be found.
Your movie or/and theatre cannot be found.

通常这个输入应该是成功的,因为列表中有“a”和“b”。

Enter movie title > a
Enter theatre name > b
-----------
Enter movie title > b
Enter theatre name > b

我认为问题在于它无法遍历剧院中的所有列表。

需要帮助提供有关如何浏览多个列表的提示。

试过用iterator(),问题也接近于此。

public void addScreening() {
System.out.println("-ADD NEW SCREENING-");

String mTitle = Helper.readString("Enter movie title > ");
String tName = Helper.readString("Enter theatre name > ");

Iterator<Movie> it1 = movies.iterator();
Iterator<Theatre> it2 = theatres.iterator();

while(it1.hasNext() && it2.hasNext()){
Movie a = it1.next();
Theatre b = it2.next();
if((a.getTitle().contains(mTitle) ) && (b.getName().contains(tName) )){
int year = Helper.readInt("Enter year > ");
int month = Helper.readInt("Enter month > ");
int day = Helper.readInt("Enter day > ");
int hour = Helper.readInt("Enter hour > ");
int min = Helper.readInt("Enter min > ");

screenings.add(new MovieScreening(Helper.thisDate(year, month, day, hour, min),a,b,0));
System.out.println("Added successfully");
break;
}else{
System.out.println("Your movie or/and theatre cannot be found. 2");
}
}

}

最佳答案

你得到所有这些错误语句的原因,即使在两个列表中都有一个匹配,你正在为每个不匹配的地方打印它们,在 else if 语句中。相反,您应该做的是,获取一个 boolean 变量 found,将其初始化为 false。现在,只需在 for 循环中加入 if block 。如果满足 if 条件,则将 found 变量重置为 true,并从循环中break

在循环外,检查found的值,如果为false,则表示没有匹配项。


这是关于您的方法的建议。但是,我会在这里采用不同的方法。

由于您使用的是 ArrayList,因此您无需手动遍历它来查找是否存在匹配项。您可以为此使用 ArrayList#contains(Object) 方法。该方法内部使用 equals() 方法进行比较,因此我将重写 Movie 中的 equals()hashCode() 方法Theatre 类。

下面是 equals 方法的样子:

// Movie:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Movie)) return false;

Movie that = (Movie) obj;

return this.title.contains(that.title) || that.title.contains(this.title);
}

Theatre 类类似:

// Theatre:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Theatre)) return false;

Theatre that = (Theatre) obj;

return this.name.contains(that.name) || that.name.contains(this.name);
}

然后,将您的 for 循环替换为:

String mTitle = Helper.readString("Enter movie title > ");
String tName = Helper.readString("Enter theatre name > ");

// Create `Movie` and `Theatre` instance
// Ideally you would not create a new instance. Rather just fetch them from
// database, or some `static` list, in case of in-memory implementation.
// From your implementation, it seems like the entered value might not be the exact
// match. So that you have to handle.
Movie movie = new Movie(mTitle);
Theatre theatre = new Theatre(tName);

// If you are fetching the movie and theatre from some database or list, then
// you should just check if `movie` and `theatre` is not `null`
if (movies.contains(movie) && theatres.contains(theatre) {
int year = Helper.readInt("Enter year > ");
int month = Helper.readInt("Enter month > ");
int day = Helper.readInt("Enter day > ");
int hour = Helper.readInt("Enter hour > ");
int min = Helper.readInt("Enter min > ");

screenings.add(new MovieScreening(Helper.thisDate(year,
month, day, hour, min), movies.get(i), theatres
.get(j), 0));
System.out.println("Added successfully");
} else {
System.out.println("Your movie or/and theatre cannot be found.");
}

关于Java - 从多个 ArrayList 中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21350603/

25 4 0