Java - 从多个 ArrayList 中获取值

标签 java arraylist

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

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

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

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

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/

相关文章:

java - 为什么我的数组列表的大小始终为 1?

java - 需要帮助来创建数据库 (Java)

java - 如何分隔数组列表的一个单元格中的项目?

java - 将日期和时间转换为时间戳格式 java "2019-02-21T14:10:18.161+0000"

java - 工具栏中的这两个图标(抽屉布局和菜单图标)是黑色的,如何将其变成白色?

java - 在决定使用 volatile 时,实际的锁是否重要?

java - 数组与字符串相反。必须使用数组

java - inputText 中有多个值? (JSF)

Java int 值类型转Character

java - 确认Java ArrayList包含特定值