2014-03-28 5 views
0

이 프로그램에서 저는 상점에서 가장 많이 소비 한 고객의 이름을 인쇄해야한다고했습니다. 가장 많이 보냈던 고객을 위해 배열 목록을 검색하는 데 도움이 필요합니다.arraylist에서 최대 값 찾기

package bestcustomer; 
import java.util.*; 
/** 
* 
* @author muf15 
*/ 
public class BestCustomer { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     ArrayList<Double> sales = new ArrayList<Double>(); 
     ArrayList<String> names = new ArrayList<String>(); 
     double salesAmount; 
     System.out.println("Enter the sales for first customer: "); 
     salesAmount = in.nextDouble(); 
     while(salesAmount !=0) 
     { 
      sales.add(salesAmount); 
      System.out.println("Enter customers name"); 
      names.add(in.next()); 
      System.out.println("Enter the next sales amount, 0 to exit: "); 
      salesAmount = in.nextDouble(); 
     } 
     String bestCustomer = nameOfBestCustomer(sales, names); 

    } 
    public static String nameOfBestCustomer(ArrayList<Double> sales, 
      ArrayList<String> customers) 
    { 
     String name = ""; 
     double maxSales; 



     return name; 
    } 


} 

답변

1

당신은 아마 Customer라는 클래스에이 두 필드를 포장하고

사용 Collections.max();

Collections.max(yourCollection, customComparator); 
1

당신은 고객에게 수업을 고려해야 만에이 이름을 찾을 것이라고한다 당신의 현재 데이터 구조 :

public static String nameOfBestCustomer(ArrayList<Double> sales, 
     ArrayList<String> customers) 
{ 
    String name = ""; 
    double maxSales = 0; 
    int index = -1; 

    for(int i = 0; i < sales.size(); i++) { 
     if(sales.get(i) > maxSales) { 
     index = i; 
     maxSales = sales.get(i); 
     } 
    } 

    if(index == -1) { 
     return null; //lists are empty 
    } 

    return customers.get(index); 
} 
0

조금 늦은 것 같아요. 두 개의 필드가있는 Customer 클래스를 만들면 namesale이 좋을 것입니다. 다른 답변에서 언급 한대로 더 좋은 디자인이 될 것입니다. 그러면 BestCustomer에서 고객 목록을 반복하여 가장 높은 판매액을 찾아 이름을 반환 할 수 있습니다. BestCustomer

private ArrayList<Customer> customers = new ArrayList<Customer>(); 

public BestCustomer(){ 
    Scanner in = new Scanner(System.in); 
    double salesAmount; 
    System.out.println("Enter the sales for first customer: "); 
    salesAmount = in.nextDouble(); 
    while(salesAmount !=0) 
    { 
     System.out.println("Enter customers name"); 
     String name = in.next(); 
     customers.add(new Customer(name, salesAmount)); 
     System.out.println("Enter the next sales amount, 0 to exit: "); 
     salesAmount = in.nextDouble(); 
    } 
    String bestCustomer = nameOfBestCustomer(); 
    System.out.print(bestCustomer); 
} 

private double highestSale(){ 
    double highestSale = 0; 
    for(Customer c: customers) 
     if (c.getSales() > highestSale) 
      highestSale = c.getSales(); 

    return highestSale; 
} 

public String nameOfBestCustomer(){ 
    for (Customer c: customers) 
     if(c.matchSale(highestSale())) 
      return c.getName(); 
    return null; 
} 

}

이이 같은 뭔가 내가 할 수있는 더 효율적인 방법이 확신 그래서 초보자 오전 Customer

public class Customer { 
private String name; 
private double sales; 



public Customer(String name, double salesAmount) { 
    this.name = name; 
    sales = salesAmount; 
} 

public boolean matchSale(double sales){ 
    return this.sales == sales; 
} 

public double getSales(){ 
    return sales; 
} 

public String getName(){ 
    return name; 
} 

} 

입니다. 또한 나는 두 개의 getters을 사용하고 있으며, 이해하는 한 더 나은 디자인은 아닙니다.

+1

nameOfBestCustomer()는 highestSale()과 동일한 코드를 사용해야합니다. 단, 고객을 저장한다는 점을 제외하고는 판매 수치. 그런 다음 고객의 이름을 반환하십시오. 그대로, 고객의 목록이 매우 커지면 nameOfBestCustomer 메서드가 매우 잘 수행되지 않습니다. 목록의 모든 고객에 대해 highestSale 내의 전체 목록을 반복합니다. 1 백만 고객을 목록에 포함 시키면 1 백만 달러 만 만들면 1 조 (1 백만 달러)의 비교를하게됩니다! –