按用户输入搜索2D ArrayList&;用Java显示行

按用户输入搜索2D ArrayList&;用Java显示行,java,arraylist,Java,Arraylist,我在一个相当简单的作业中遇到了一些问题,但在这里找不到一个似乎有效的答案 我需要有一个包含员工数据的2D ArrayList,然后能够运行一个单独的函数,该函数允许用户输入员工的姓名,搜索ArrayList中的姓名,如果该姓名存在,则显示整行数据 以下是到目前为止我得到的信息: ArrayList List<List<String>> staffArrayString = new ArrayList<>(); staffArrayString.add(Arra

我在一个相当简单的作业中遇到了一些问题,但在这里找不到一个似乎有效的答案

我需要有一个包含员工数据的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"));
List statfArrayString=new ArrayList();
添加(Arrays.asList(“史蒂文·乔治”、“约克路12号”、“07123456678”、“永久”、“约克”、“27000/年”);
添加(Arrays.asList(“Rina Veyer”,“利兹路20号”,“08987987765”,“兼职”,“利兹”,“10/小时”);
staffArrayString.add(Arrays.asList(“Brian Lym”、“Bradford路13号”、“07123234345”、“永久”、“Bradford”、“27000/年”);
搜索功能

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) + " ");
    }
}
public void staffNameSearch(){
System.out.println(“输入工作人员姓名:”);
字符串staffName=in.next();
布尔值=false;
int行=0;
对于(int i=0;i
目前,我在最后的打印行得到了“线程“main”java.lang.IndexOutOfBoundsException中的异常”的输出,但我一辈子都不知道为什么。我非常感谢任何关于这方面的建议(特别是如果我犯了一些明显而愚蠢的错误!)

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

  • 如果(found=true),请小心
    ——这是不正确的;首选:

    • a)
      if(找到)
    • b)
      if(found==true)
  • 为了提高效率,请包括
    &&!在for循环中找到
    ,以便在找到某个内容后立即退出

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

  • 如果(found=true),请小心
    ——这是不正确的;首选:

    • a)
      if(找到)
    • b)
      if(found==true)
  • 为了提高效率,请包括
    &&!在for循环中找到
    ,以便在找到某个内容后立即退出


  • 您可以为每个循环使用,以简化操作

    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 + " ");
    }
    

    您可以为每个循环使用,以简化操作

    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 + " ");
    }
    

    通过使用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");
        }
    }
    
    private Map staffDirectory;//字符串是小写的名称
    public void staffNameSearch(){
    //代码
    如果(staffDirectory.containsKey(staffName)){//请确保staffName是小写的
    System.out.print(staffDirectory.get(staffName)+“”);
    }否则{
    System.out.println(“未找到名称”);
    }
    }
    

    这样可以避免使用循环并获得O(1)效率。

    通过使用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");
        }
    }
    
    private Map staffDirectory;//字符串是小写的名称
    public void staffNameSearch(){
    //代码
    如果(staffDirectory.containsKey(staffName)){//请确保staffName是小写的
    System.out.print(staffDirectory.get(staffName)+“”);
    }否则{
    System.out.println(“未找到名称”);
    }
    }
    

    这样可以避免使用循环并获得O(1)效率。

    哪一行引发异常?@Stewart抱歉,忘记指定了。这是搜索函数末尾的打印行,编辑后添加。通过将
    System.out.print(“row==”+row+;“staffarrystring.length()=”+staffarrystring.length()
    放在该行的前面进行调试。
    这里是不是输入错误:
    for(int i=0;i<=staffarrystring.size();i++){
    @ASutherland是的,是的……我发誓有一天我会学会打字……哪一行会引发异常?@Stewart抱歉,忘了指定。这是搜索函数末尾的打印行,经过编辑添加它。通过放入
    System.out.print(“row==”+row+”;staffarrystring.length()==“+staffarrystring.length()进行调试
    就在那一行之前。
    <=/code>这里是打字错误吗:
    for(int i=0;i<=staffarrystring.size();i++){
    @ASutherland是的,它是……我发誓有一天我会学会打字的……谢谢,这很好!另外还要感谢你注意到缺少的等号,我偶尔还是会犯错误。谢谢,这很好!另外还要感谢你注意到缺少的等号,我仍然会犯错误谢谢你的建议!我一定会考虑在将来使用类似的东西,它看起来更简单、更高效!谢谢你的建议!我一定会考虑在将来使用类似的东西,它看起来更简单、更高效!