我在一个相当简单的任务中遇到了一些麻烦,但是在这里找不到合适的答案。
我需要一个包含人员数据的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;在那里的印刷线上,但我不能为我的生活找出原因。我对这方面的任何建议表示感谢(特别是如果这是我的一些明显和愚蠢的错误!)。
答案 0 :(得分:1)
发生错误是因为您要将行设置为与行计数器无关的内容。当您发现i
元素中具有名称的行(变量j
)时,请设置row=i
。
小心if (found = true)
- 这是不正确的;更喜欢:
if (found)
if (found == true)
为提高效率,请在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)效率。