2017-10-18 93 views
0

我有一个ArrayList正在使用Customer类填充客户信息。在我的addCustomerRecord方法中,我在addCustomerRecord方法中调用findAddIndex,这样输入的数据将在显示数据之前排序。这里是我的代码,不介意fileWhatever方法,我不使用它。查找ArrayList索引以查找对象将添加到的位置的方法

public class CustomerDemo 
{ 
    //arrayList of customer objects 
    public static ArrayList<Customer> customerAL = new ArrayList<>(); 



    public static void main (String[] args) 
    {   
     //to hold menu choice 
     String menuChoice = ""; 

     Scanner kb = new Scanner(System.in); 

     System.out.println("To add a record press 'A': \n" 
       + "to display all records press 'D': \n" 
       + "to exit press 'Q': \n"); 

     //loop priming read 
     menuChoice = kb.nextLine(); 

     //make input case insensitive 
     menuChoice = menuChoice.toLowerCase(); 


     do 
     { 
      if(menuChoice.equals("a")) 
       addCustomerRecord(kb); 
      else if(menuChoice.equals("d")) 
      { 
       displayCustomerRecords(); 
      } 
      else if(menuChoice.equals("q")) 
      { 
       System.out.println("Program exiting.."); 
       System.exit(0); 
      } 

      else 
      { 
       System.out.println("incorrect entry. Please re-enter a valid entry: \n"); 
       menuChoice = kb.nextLine(); 
       menuChoice = menuChoice.toLowerCase(); 
      } 

      System.out.println("To add a record press 'A': \n" 
        + "to display all records press 'D': \n" 
        + "to exit press 'Q': \n"); 
      menuChoice = kb.nextLine(); 
      menuChoice = menuChoice.toLowerCase(); 
     }while(menuChoice.equals("a") || menuChoice.equals("d") || menuChoice.equals("q")); 


     kb.close(); 
    } 

    /*  public static void displayCustomerRecords() 
    { 
     System.out.println(); 
     for (int i = 0; i < customerAL.size(); ++i) 
     { 
      System.out.printf("%-15s", customerAL.get(i).getLastName()); 
      System.out.printf("%-15s", customerAL.get(i).getFirstName()); 
      System.out.printf("%-6s", customerAL.get(i).getCustID()); 
      System.out.printf("%15s\n", customerAL.get(i).getPhoneNumber()); 
     } 
     System.out.println(); 
    } 


    /** 
    * prompts to enter customer data and mutator methods called 
    * with a Scanner object passed as an argument to set data 
    * @param location index position of where the element will be added. 
    * @param kb a Scanner object to accept input 
    */ 

    public static void addCustomerRecord(Scanner kb) 
    { 

     Customer currentCustomerMemoryAddress = new Customer(); 

     System.out.println("Enter first name: \n"); 
     String fName = kb.nextLine(); 
     currentCustomerMemoryAddress.setFirstName(fName); 

     System.out.println("Enter last name: \n"); 
     String lName = kb.nextLine(); 
     currentCustomerMemoryAddress.setLastName(lName); 

     System.out.println("Enter customer phone number: \n"); 
     String pNum = kb.nextLine(); 
     currentCustomerMemoryAddress.setPhoneNumber(pNum); 

     System.out.println("Enter customer ID number: \n"); 
     String ID = kb.nextLine(); 
     currentCustomerMemoryAddress.setCustID(ID); 

     int addLocation = findAddLocation(currentCustomerMemoryAddress); 

     customerAL.add(addLocation, currentCustomerMemoryAddress); 

     currentCustomerMemoryAddress = null; 
    } 

    public static int findAddLocation(Customer cust) 
    { 
     int location = 0; 

     if(!customerAL.isEmpty()) 
     { 
      for(int i = 0; i < customerAL.size(); i++) 
      { 
       //Stumped here 
      } 
     } 
     else 
      return location; 
     return location; 
    } 
}  

回答

2

看起来你正在改造这里的轮威廉

这种替换代码为displayCustomerRecords

public static void displayCustomerRecords() 
    { 
     System.out.println(); 
     customerAL.stream().map(c -> String.format("%-15s%-15s%-6s%15s\n", 
       c.getLastName(), c.getFirstName(), c.getCustID(), c.getPhoneNumber())) 
       .sorted() 
       .forEach(System.out::print); 
     System.out.println(); 
    } 

更新

考虑到您的评论,你可以用以下方法替换您的findAddLocation方法:

private static Comparator<Customer> comparator = Comparator.comparing(Customer::getLastName) 
       .thenComparing(Customer::getFirstName) 
       .thenComparing(Customer::getCustID) 
       .thenComparing(Customer::getPhoneNumber); 


public static int findAddLocation(Customer cust) 
{ 

    int location = 0; 

    if(!customerAL.isEmpty()) 
    { 
     for(Customer customerInList : customerAL) 
     { 
      if(comparator.compare(customerInList, cust) > 0) { 
       break; 
      } 
      location++; 
     } 
    } 
    return location; 
} 

我们使用Java的增强型for循环遍历数组,并使用Java 8声明的比较器(我相信这是该赋值的关键)比较对象。

如果您可以查看Comparable界面,并在您的Customer类中实施它,这将是一个不错的主意。这样,您可以简单地调用customerInList.compareTo(cust)来比较两个对象。

如前所述,这是不是一个很好的做法,不应在生产代码中使用。

+0

我相信我的教授希望这门课重新发明车轮。赋值规范说:“从addCustomerRecord方法调用findAddLocation方法,以便arrayList在显示时依次显示。” findAddLocation方法假设在ArrayList中找到正确的索引以根据客户的姓氏放置对象。 @MarcNuri –

+0

我已经添加了另一种方法来解决您的问题。请考虑查看Java中的Comparator和Comparable。 –