通过用户输入&搜索2D ArrayList。在Java中显示行

时间:2018-01-27 01:20:52

标签: java arraylist

我在一个相当简单的任务中遇到了一些麻烦,但是在这里找不到合适的答案。

我需要一个包含人员数据的2D ArrayList,然后能够运行一个单独的函数,允许用户输入一个工作人员的名字,在ArrayList中搜索该名称,如果它存在,显示整行数据。

这是我到目前为止所得到的:

ArrayList

List<List<String>> staffArrayString = new ArrayList<>();
staffArrayString.add(Arrays.asList("Steven George", "12 York Road", "07123456678", "Permanent", "York", "27000/yr"));
staffArrayString.add(Arrays.asList("Rina Veyer", "20 Leeds Road", "08987987765", "Part Time", "Leeds", "10/hr"));
staffArrayString.add(Arrays.asList("Brian Lym", "13 Bradford Road", "07123234345", "Permanent", "Bradford", "27000/yr"));

搜索功能

public void staffNameSearch() {
    System.out.println("Enter name of staff member:");
    String staffName = in.next();
    boolean found = false;
    int row = 0;
    for (int i = 0; i < staffArrayString.size(); i++) {
        for (int j = 0; j < staffArrayString.get(i).size(); j++) {
            if (staffArrayString.get(i).get(j).equals(staffName)) {
                row = staffArrayString.get(i).size();
                found = true;
            }
        }
    }
    if (found = true) {
        System.out.print(staffArrayString.get(row) + " ");
    }
}

我目前在线程&#34;主要&#34;中获得&#39;异常的输出? java.lang.IndexOutOfBoundsException&#39;在那里的印刷线上,但我不能为我的生活找出原因。我对这方面的任何建议表示感谢(特别是如果这是我的一些明显和愚蠢的错误!)。

3 个答案:

答案 0 :(得分:1)

  1. 发生错误是因为您要将行设置为与行计数器无关的内容。当您发现i元素中具有名称的行(变量j)时,请设置row=i

  2. 小心if (found = true) - 这是不正确的;更喜欢:

    • a)if (found)
    • b)if (found == true)
  3. 为提高效率,请在for循环中加入&& !found,以便在找到内容后立即退出。

答案 1 :(得分:1)

您可以使用每个循环更简单。

System.out.println("Enter name of staff member:");
String staffName = in.next();
boolean found = false;
String[] foundArray;
for(String[] staffArray: staffArrayString){
     for(String str : staffArray){
          if(str.equals(staffName)){
           foundArray = staffArray;
           found = true;
           break;
          }
     }  
}
if (found == true) {
    System.out.print(foundArray + " ");
}

答案 2 :(得分:0)

您可以使用Map和Staff类来简化代码。

例如,Staff类

public class Staff{
    String name;
    String address;
    String id; // ?
    boolean permanent; // Or a enum if there are more than 2 values
    String city; // ?

    int payrate;
    boolean hourly;

    @Override
    public String toString(){ // Easily convert the class to a String
        return String.format("%s %s %s %s %s $%d/%s", 
                    name,
                    address,
                    id,
                    permanent ? "Permanent" : "Part-time",
                    city,
                    payrate,
                    hourly ? "hr" : "yr");
    }
}

并且代码可以阅读

private Map<String, Staff> staffDirectory; // String is the name in lowercase

public void staffNameSearch() {
    // Code
    if(staffDirectory.containsKey(staffName)){ // Make sure staffName is lowercase
          System.out.print(staffDirectory.get(staffName) + " ");
    } else {
          System.out.println("Name not found");
    }
}

通过这种方式,您可以避免使用循环并获得O(1)效率。