如何显示数组列表中的元素?

How do I display the elements from my arraylist?

我正在写收银排队系统的程序。该程序应添加、编辑和删除客户信息:id、lastname、firstname 和 age。该程序应优先显示或首先显示 60 岁以上的客户,然后才是其他客户。

这是我的 CustomerInfo class.

public class CustomerInfo {
  //instance variables
  public int custID;
  public String lastname, firstname;
  public int age;

  //overloading constructors
  public CustomerInfo(int custID, String lastname, String firstname, int age) {
     this.custID = custID;
     this.lastname = lastname;
     this.firstname = firstname;
     this.age = age;
  }
  public CustomerInfo() {
     custID = 0;
     lastname = "";
     firstname = "";
     age = 0;
  }
  //setters or mutator methods
  public void setCustID(int custID) {
     this.custID = custID;
  }
  public void setLastName(String lastname) {
     this.lastname = lastname;
  }
  public void setFirstName(String firstname) {
     this.firstname = firstname;
  }
  public void setAge(int age) {
     this.age = age;
  }
  //getters or accessor methods
  public int getCustID() {
     return custID;
  }
  public String getLastName() {
     return lastname;
  }
  public String getFirstName() {
     return firstname;
  }
  public int getAge() {
     return age;
  }
}

这是我的添加和查看代码:

import java.util.*;
import javax.swing.*;

public class FinalProject {
    public static void main(String[] args) throws IOException, InterruptedException {
        Scanner input = new Scanner(System.in);
        CustomerInfo[] cusInfo = new CustomerInfo[5];
        ArrayList<Integer> cusId = new ArrayList<>();
        ArrayList<String> lastNames = new ArrayList<>();
        ArrayList<String> firstNames = new ArrayList<>();
        ArrayList<Integer> ages = new ArrayList<>();
        ArrayList<Integer> cusIdSenior = new ArrayList<>();
        ArrayList<String> lastNamesSenior = new ArrayList<>();
        ArrayList<String> firstNamesSenior = new ArrayList<>();
        ArrayList<Integer> agesSenior = new ArrayList<>();
        int count = 0, countSenior = 0;
        CustomerInfo ci = new CustomerInfo();
        int customernum = 0;

        System.out.println("ADD CUSTOMER DETAILS");
        
        for(int i = 0; i < 5; i++) {
           System.out.print("Customer's ID           : ");
           int custID = input.nextInt();
           System.out.print("Customer's Last Name    : ");
           String lastname = input.next();
           System.out.print("Customer's First Name   : ");
           String firstname = input.next();
           System.out.print("Customer's Age          : ");
           int age = input.nextInt();
           CustomerInfo c = new CustomerInfo(custID, lastname, firstname, age);
                    
           cusInfo[customernum] = c;
           customernum++;
           System.out.println();
        }

        //VIEW CUSTOMER DETAILS
        if(customernum == 0) {
          JOptionPane.showMessageDialog(null, "QUEUE IS EMPTY. NOTHING TO VIEW.");
        }
        else{
           System.out.println("VIEW CUSTOMER DETAILS");
           for(int i = 0; i < customernum; i++) {
              cusId.add(ci.custID);
              lastNames.add(ci.lastname);
              firstNames.add(ci.firstname);
              ages.add(ci.age);
              count++;
           }
           for(int i = 0; i < count; i++) {
              if(ages.get(i) >= 60) {
                cusIdSenior.add(cusId.get(i));
                lastNamesSenior.add(lastNames.get(i));
                firstNamesSenior.add(firstNames.get(i));
                ages.add(ages.get(i));
                countSenior++;
              }
           }
           for(int i = 0; i < countSenior; i++) {
             System.out.printf("Customer ID         : %d\n", cusIdSenior.get(i));
             System.out.printf("Customer Last Name  : %s\n", lastNamesSenior.get(i));
             System.out.printf("Customer First Name : %s\n", firstNamesSenior.get(i));
             System.out.printf("Customer Age        : %s\n", agesSenior.get(i));
           }
           for(int i = 0; i < count; i ++) {
              if(ages.get(i) < 60 && ages.get(i) > 0) {
                 System.out.printf("Customer ID         : %d\n", cusId.get(i));
                 System.out.printf("Customer Last Name  : %s\n", lastNames.get(i));
                 System.out.printf("Customer First Name : %s\n", firstNames.get(i));
                 System.out.printf("Customer Age        : %s\n", ages.get(i));
              }
           }
        }
    }
}

问题是在我运行输入所有元素后,它不会显示语句,程序会立即退出。

很高兴您改进了问题,这表明您已经尝试过了。这就是我之前所说的。使用比较器,将以下内容添加到您的代码中:

添加这个class

public class SortByAge implements Comparator<CustomerInfo> {

    @Override
    public Comparator<CustomerInfo> reversed() {
        return Comparator.super.reversed();
    }

    @Override
    public int compare(CustomerInfo o1, CustomerInfo o2) {
        return o1.getAge() - o2.getAge();
    }
  
}

然后在主要

Scanner input = new Scanner(System.in);
        ArrayList<CustomerInfo> customerInfo = new ArrayList<>();

        System.out.println("ADD CUSTOMER DETAILS");
        for(int i = 0; i < 2; i++) {
           System.out.print("Customer's ID           : ");
           int custID = input.nextInt();
           System.out.print("Customer's Last Name    : ");
           String lastname = input.next();
           System.out.print("Customer's First Name   : ");
           String firstname = input.next();
           System.out.print("Customer's Age          : ");
           int age = input.nextInt();
           CustomerInfo c = new CustomerInfo(custID, lastname, firstname, age);
           customerInfo.add(c);
           System.out.println();
        }
        
        SortByAge sba = new SortByAge();
        Collections.sort(customerInfo,sba.reversed());
        
        for(CustomerInfo ci : customerInfo){
            System.out.printf("Customer ID         : %d\n", ci.getCustID());
            System.out.printf("Customer Last Name  : %s\n", ci.getFirstName());
            System.out.printf("Customer First Name : %s\n", ci.getLastName());
            System.out.printf("Customer Age        : %s\n", ci.getAge());
        }

程序逻辑貌似繁杂,不太明白为什么把客户数据数组cusInfo复制成几个列表,把输入的数据存入数组,不使用它完全在 "VIEW CUSTOMER DETAILS" 消息之后的循环中。

当您使用 ci 变量时,列表将填充空字符串和 0 年龄。

对现有代码进行简单修复以使其正常工作可能是:

System.out.println("VIEW CUSTOMER DETAILS");
for (int i = 0; i < customernum; i++) {
    ci = cusInfo[i];              //  use the data stored in the array!
    cusId.add(ci.custID);
    lastNames.add(ci.lastname);
    firstNames.add(ci.firstname);
    ages.add(ci.age);
    count++;
}

for (int i = 0; i < count; i++) {
    if (ages.get(i) >= 60) {
        cusIdSenior.add(cusId.get(i));
        lastNamesSenior.add(lastNames.get(i));
        firstNamesSenior.add(firstNames.get(i));
        agesSenior.add(ages.get(i));              // fixed typo, should be agesSenior
        countSenior++;
    }
}

但是,如果实际任务是按年龄 排序 客户并将年长的人移到顶部,则应在以下情况下实施和使用自定义 Comparator调用 Arrays.sort(例如作为 lambda)。

排序的逻辑可以是这样的:如果只有一个顾客是高级的,则放在第一位;否则按年龄比较客户:60 -> 65 -> 70 -> 35 -> 45 -> 59

此外,可能会完全删除填充不必要列表的冗余代码,从而导致以下结果:

Scanner input = new Scanner(System.in);
CustomerInfo[] cusInfo = new CustomerInfo[5];

System.out.println("ADD CUSTOMER DETAILS");

for (int i = 0; i < cusInfo.length; i++) {
   System.out.print("Customer's ID           : ");
   int custID = input.nextInt();
   System.out.print("Customer's Last Name    : ");
   String lastname = input.next();
   System.out.print("Customer's First Name   : ");
   String firstname = input.next();
   System.out.print("Customer's Age          : ");
   int age = input.nextInt();
   CustomerInfo c = new CustomerInfo(custID, lastname, firstname, age);
            
   cusInfo[i] = c;
   System.out.println();
}

System.out.println("VIEW CUSTOMER DETAILS");
Arrays.sort(cusInfo, (c1, c2) -> c1.age >= 60 ^ c2.age >= 60 // check if _only one_ is senior
        ? (c1.age >= 60 ? -1 : 1) // put senior first
        : Integer.compare(c1.age, c2.age) // compare by age
);
   
for (CustomerInfo ci : cusInfo) {
    System.out.printf("Customer ID         : %d\n", ci.custID);
    System.out.printf("Customer Last Name  : %s\n", ci.lastname);
    System.out.printf("Customer First Name : %s\n", ci.firstname);
    System.out.printf("Customer Age        : %s\n", ci.age);
}

示例输出:

VIEW CUSTOMER DETAILS
Customer ID         : 1
Customer Last Name  : aa
Customer First Name : bb
Customer Age        : 60
Customer ID         : 4
Customer Last Name  : eg
Customer First Name : jg
Customer Age        : 72
Customer ID         : 5
Customer Last Name  : ww
Customer First Name : nh
Customer Age        : 39
Customer ID         : 3
Customer Last Name  : gg
Customer First Name : qq
Customer Age        : 48
Customer ID         : 2
Customer Last Name  : rr
Customer First Name : ww
Customer Age        : 58