2014-10-01 10 views
0

Я уже часами пытаюсь закончить свое задание. Теперь, когда я закончил, я хотел бы добавить метод, который сортирует ценность клиентов. Так что клиент 2 приходит сверху и 5 последний. Как мне это сделать?Как отсортировать список моих объектов

Вот код для первого класса:

public class Customer { 

    private int customerNumber; 
    private int purchases; 
    private int shippingCost; 
    private int productPrice; 

    public int getProductPrice() { 
     return productPrice; 
    } 

    public void setProductPrice(int productPrice) { 
     this.productPrice = productPrice; 
    } 

    public int getPurchases() { 
     return purchases; 
    } 

    public Customer(int purchases, int shippingCost, int productPrice) { 
     this.purchases = purchases; 
     this.shippingCost = shippingCost; 
     this.productPrice = productPrice; 
    } 

    public void setPurchases(int purchases) { 
     this.purchases = purchases; 
    } 

    public int getShippingCost() { 
     return shippingCost; 
    } 

    public void setShippingCost(int shippingCost) { 
     this.shippingCost = shippingCost; 
    } 

    protected int calculateValue() { 
     int value=purchases*(productPrice-shippingCost); 
     return value; 
    } 

    public int getCustomerNumber() { 
     return customerNumber; 
    } 

    public void setCustomerNumber(int customerNumber) { 
     this.customerNumber = customerNumber; 
    } 

Второй класс:

public class Subscriber extends Customer{ 

    private int years; 
    private int fee; 

    public Subscriber(int purchases, int shippingCost, int productPrice) { 
     super(purchases, shippingCost, productPrice); 
    } 

    public Subscriber(int purchases, int shippingCost, 
      int productPrice,int _years,int _fee) { 
     super(purchases, shippingCost, productPrice); 
     years=_years; 
     fee=_fee; 
    } 

    public int getYears() { 
     return years; 
    } 

    public void setYears(int years) { 
     this.years = years; 
    } 

    public int getFee() { 
     return fee; 
    } 

    public void setFee(int fee) { 
     this.fee = fee; 
    } 

    protected int calculateSubscriptionValue() { 
     return years*fee; 
    } 

    protected int calculateValue(){ 
     int value=super.calculateValue(); 
     value+=calculateSubscriptionValue(); 
     return value; 
    } 

Третий класс:

public class BusinessSubscriber extends Subscriber{ 

    public BusinessSubscriber(int purchases, int shippingCost, int productPrice, int _years, int _fee) { 
     super(purchases, shippingCost, productPrice, _years, _fee); 
    } 
    private double supportCost; 
    private double supportTime; 

    public double getSupportCost() { 
     return supportCost; 
    } 
    public void setSupportCost(double supportCost) { 
     this.supportCost = supportCost; 
    } 
    public double getSupportTime() { 
     return supportTime; 
    } 
    public void setSupportTime(double supportTime) { 
     this.supportTime = supportTime; 
    } 

    //override method: // skriv över den // problem med denna metod. uträkningsfel 
    protected int calculateValue(){ 
     int value=super.calculateValue(); 
     value+=calculateSubscriptionValue() - calculateSubscriptionValue(); 
     return value; 
    } 
} 

Последний и главный класс:

public class printValue { 

    public static void main(String[] args) { 
     System.out.println("Unsorted version without DataStructure"); 
     System.out.println("-----------------------"); 
     BusinessSubscriber num1 = new BusinessSubscriber(3, 33, 99, 8, 78); 

     num1.setCustomerNumber(1); 

     num1.setPurchases(3); 
     num1.setShippingCost(33); 
     num1.setYears(8); 
     num1.setSupportTime(2); 
     num1.setProductPrice(99); 
     num1.setFee(78); 
     num1.setSupportCost(25); 
     System.out.println("Customer number: " + num1.getCustomerNumber() + " is worth " + num1.calculateValue() + "!"); 

     BusinessSubscriber num2 = new BusinessSubscriber (0, 0, 99, 18, 78); 

     num2.setCustomerNumber(2); 

     num2.setPurchases(0); 
     num2.setShippingCost(0); 
     num2.setYears(18); 
     num2.setSupportTime(7); 

     num2.setProductPrice(99); 
     num2.setFee(78); 
     num2.setSupportCost(25); 

     System.out.println("Customer number: " + num2.getCustomerNumber() + " is worth " + num2.calculateValue() + "!"); 

     BusinessSubscriber num3 = new BusinessSubscriber (0, 0, 99, 8, 78); 

     num3.setCustomerNumber(3); 

     num3.setPurchases(0); 
     num3.setShippingCost(0); 
     num3.setYears(8); 
     num3.setSupportTime(0); 

     num2.setProductPrice(99); 
     num2.setFee(78); 
     num2.setSupportCost(25); 

     System.out.println("Customer number: " + num3.getCustomerNumber() + " is worth " + num3.calculateValue() + "!"); 

     // int purchases, int shippingCost, int productPrice, int _years, int _fee 

     Subscriber num4 = new Subscriber (12, 33, 99, 5, 78); 

     num4.setCustomerNumber(4); 

     num4.setPurchases(12); 
     num4.setShippingCost(33); 
     num4.setYears(5); 

     num4.setProductPrice(99); 
     num4.setFee(78); 

     System.out.println("Customer number: " + num4.getCustomerNumber() + " is worth " + num4.calculateValue() + "!"); 

     Customer num5 = new Customer (8, 33, 99); 

     num5.setCustomerNumber(5); 

     num5.setPurchases(8); 
     num5.setShippingCost(33); 
     num5.setProductPrice(99); 

     System.out.println("Customer number: " + num5.getCustomerNumber() + " is worth " + num5.calculateValue() + "!"); 

     // sortera efter calculatevalue metoden i businesssubsriber 
} 

Выход кода:

Customer number: 1 is worth 822! 
Customer number: 2 is worth 1404! 
Customer number: 3 is worth 624! 
Customer number: 4 is worth 1182! 
Customer number: 5 is worth 528! 

Я хотел бы номер клиента 2, чтобы быть на вершине и 5 последних, то есть сортировать их. Как мне это сделать? Спасибо.

Я пробовал это, но этого достаточно?

Integer [] sort = {num1.calculateValue(), num2.calculateValue(), num3.calculateValue(), num4.calculateValue(), num5.calculateValue()}; 

List<Integer> l1 = Arrays.asList(sort); 

Collections.sort(l1); 
System.out.println("Values sorted: " + l1); 

Но более эффективным способом было бы поместить все это на карту, прокрутить ее, а затем распечатать. Как мне это сделать?

Кроме того, я пытался редактировать текст настолько, насколько могу, поэтому он не выглядит грязным.

ответ

0

Если сортировка ваших клиентов на основе calculateValue() может б вы можете сделать так:

Map sortedCustomer= new TreeMap(); 
sortedCustomer.put(num1.calculateValue(),num1); 
sortedCustomer.put(num2.calculateValue(),num2); 
sortedCustomer.put(num3.calculateValue(),num3); 
sortedCustomer.put(num4.calculateValue(),num4); 
sortedCustomer.put(num5.calculateValue(),num5); 
//sortedCustomer is in ascending order...reverse it 
sortedCustomerDescending =(TreeSet)sortedCustomer.descendingSet(); 
//get entrySet 
    Set set = sortedCustomerDescending.entrySet(); 
    // Get an iterator 
    Iterator i = set.iterator(); 
    // Display elements 
    while(i.hasNext()) { 
    Map.Entry me = (Map.Entry)i.next(); 
    //print the entries 
    System.out.print(me.getKey() + ": "); 
    System.out.println(me.getValue()); 
    } 
0

Я предполагаю, что вы хотите, чтобы отсортировать в порядке убывания.

Вам необходимо передать реализацию a Comaprator и передать его методу Collections#sort вместе со списком, в котором хранятся объекты, которые вы хотите отсортировать.

Что-то Лик это должно сделать это

public void testSort() { 
    List<Customer> cL = Arrays.asList(new Customer(1, 822), 
      new Customer(2, 1404), 
      new Customer(3, 624), 
      new Customer(4, 1182), 
      new Customer(5, 528)); 
    Collections.sort(cL, new Comparator<Customer>() { 
     @Override 
     public int compare(Customer o1, Customer o2) { 
      return o2.getCalc() - o1.getCalc(); 
     } 
    }); 

    for(Customer c : cL) { 
     System.out.println("Customer number: " + c.getCustomerNumber() 
       + " is worth " + c.getCalc() + "!"); 
    } 
} 

Выход:

Customer number: 2 is worth 1404! 
Customer number: 4 is worth 1182! 
Customer number: 1 is worth 822! 
Customer number: 3 is worth 624! 
Customer number: 5 is worth 528! 

Для простоты я добавил подал calc в Customer себя, вы, вероятно, хотите реализовать компаратор для BusinessSubscriber класса, как значение, которое вы ищете для сортировки, исходит от него.

0

Ваш класс Клиент должен осуществлять сопоставимый интерфейс

public class Customer implements Comparable<Customer>{ 

Вы должны переопределить его метод CompareTo

@Override 
public int compareTo(Customer cus) { 
int calculatedValue = cus.calculateValue(); 
return calculatedValue - this.calculateValue(); 
} 

Наконец в вашем PrintValue класса, добавьте те клиенты ArrayList и использование коллекции.сортировать

ArrayList<Customer> custList = new ArrayList<>(); 
custList.add(num1); 
custList.add(num2); 
custList.add(num3); 
custList.add(num4); 
custList.add(num5); 

Collections.sort(custList); 

for (Iterator iterator = custList.iterator(); iterator.hasNext();) { 
    Customer customer = (Customer) iterator.next(); 
    System.out.println("Customer number: " + customer.getCustomerNumber() + " is worth " + customer.calculateValue() + "!"); 
} 
0

Если у вас есть список объектов, вы можете отсортировать его с Collections.sort.

Глупый пример (не компилируется или запустить):

Collections.sort(listOfUsers, new Comparator<User>() { 
    @Override 
    public int compare(User u1, User u2) { 
     return Integer.compare(u1.getAge(), u2.getAge()); 
    } 
}); 

Это сравнение не может быть именно то, что вам нужно сделать, но вы получите идею :-)

Смежные вопросы