2015-02-21 2 views
0

мне нужно разобраться в следующем array-Java: Как отдать приоритет категории, если цена такая же?

“Blouse” “W” 21 17.95 
“Blouse” “C” 35 17.95 
“Shirt” “M” 13 21.95 
“Pants” “W” 22 67.95 
“Pants” “M” 22 62.95 
“Pants” “C” 26 21.95 
“Coat” “C” 20 21.95 
“Coat” “M” 10 62.95 
“Blouse” “W” 21 17.95 
“Blouse” “C” 35 17.95 
“Shirt” “M” 13 21.95 
“Pants” “W” 22 67.95 
“Pants” “M” 22 62.95 
“Pants” “C” 26 21.95 
“Coat” “C” 20 21.95 
“Coat” “M” 10 62.95 

Если цены такие же, мне нужно отдавать приоритет С перед W и W, прежде чем М. Мне нужно использовать выбор сортировки для этой программы, и это следующий образом-

public static void selectionSort (Comparable[] list, int n) 
{ 
    int min; 
    Comparable temp; 

    for (int i = 0; i< n - 1;i++) 
    { 
     min = i; 

     for(int scan = i + 1; scan < n; scan++) 
     { 
      if (list[i].compareTo(list[scan]) < 0) 
       min = scan; 
     } 

     temp = list[min]; 
     list[min] = list[i]; 
     list[i] = temp; 

    } 

У меня возникают проблемы, когда цены равны, мой метод CompareTo выглядит следующим образом. Я имею в виду использование дозорных значений, чтобы уделить приоритетное внимание этим категориям, но как бы я это сделал? Кроме того, что должен делать алгоритм сортировки, имея все эти контрольные значения для разных категорий при просмотре всего массива. Как он должен выбрать подходящий (C до W, w перед M) объект для обмена?

public int compareTo(Object obj) 
{ 
    int result; 
    double objPrice = ((Item)obj).getPrice(); 
    char objCategory = ((Item)obj).getCategory().charAt(1); 

    if (objPrice == price) 
    //   { 
    //    if(objCategory.charAt(1) == 'M') 
    //    return result = 0; 
    //    else 
    //    return result = 1; 
    //   } 
     switch (objCategory) 
     { 
      case 'C': 
      return -1; 
     } 
    else 
     return result = (int)(objPrice - price); 

} 
+0

Вы можете выполнить два прогона сортировки, которые сортируются по цене, а вторая проверяет группы с равными значениями и повторно сортирует эти группы по категориям. –

ответ

0

вместо инструкции коммутатора, вы должны сделать, если заявления:

public int compareTo(Object obj) 
{ 
    int result; 
    double objPrice = ((Item)obj).getPrice(); 
    char objCategory = ((Item)obj).getCategory().charAt(1); 

    if (objPrice == price) { 
     if(category == objCategory) { 
      return name.compareTo(((Item)obj).getName()); // if we have the same category, we need to decide somehow 
     } 
     if(category == "C") return 1; // C always beats everything 
     if(objCategory == "C") return -1; 

     if(category == "M") return -1; // M always looses 
     if(objCategory == "M") return 1; 
    } else { 
     return result = (int)(objPrice - price); 
    } 

} 

Это охватывает все 6 возможных комбинаций cetegories:

C - C => they are the same 
C - W => one is C 
C - M => one is C 
W - C => one is C 
W - W => they are the same 
W - M => one is M 
M - C => one is C 
M - W => one is M 
M - M => they are the same 
+0

Если категории одинаковы, нам нужно решить, что? – ScaVenGerS

+0

Нам нужно решить, что вернуть. И поскольку у всех элементов есть имя, я решил, что лучше отсортировать их по алфавиту. Если у них есть одинаковая цена, категория и имя, то он будет считать, что это тот же объект. – reckter

0

Ваш CompareTo не закончен , Вам нужно сравнить категории двух элементов.

Внутри если (objPrice == цены) добавить что-то вроде:

if (objCat == 'C') 
     return cat == 'C' ? 0 : -1 

    if (objCat == 'W') 
     return cat == 'C' 
     ? 1 
     : (cat == 'W') 
      ? 0 
      : -1 

    if (objCat == 'M') 
    ... Check for three possibilities 

Чтобы упростить сравнение, добавить отображение из категории до целого (например, с помощью карты). Это сделает ваше сравнение выглядеть следующим образом:

if (objPrice == price) 
    return mappedValueOf(cat1) - mappedValueOf(cat2) 
0

Если вы используете вы можете использовать API Streaming: ■ в сочетании с Comparator.comparing и Comparator.thenComparing сделать сортировочную работу.

Если предположить следующий Item класс:

public class Item { 
    private final String category; 
    private final String name; 
    private final double price; 
    private final int size; 

    public Item(
      final String name, 
      final String category, 
      final int size, 
      final double price) { 

     this.name = name; 
     this.category = category; 
     this.size = size; 
     this.price = price; 
    } 

    public String getCategory() { 
     return category; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getSize() { 
     return size; 
    } 

    @Override 
    public String toString() { 
     return "Item: [" + 
       Objects.toString(name) + " " + 
       Objects.toString(category) + " " + 
       Objects.toString(price) + " " + 
       Objects.toString(size) + "]"; 
    } 
} 

Затем сортировкой можно сделать так:

final List<Item> items = Arrays.asList(
     new Item("Blouse", "W", 21, 20.95), 
     new Item("Blouse", "W", 21, 17.95), 
     new Item("Blouse", "M", 21, 17.95), 
     new Item("Blouse", "C", 21, 17.95)); 

final List<String> categoryPrioOrder = Arrays.asList("C", "W", "M"); 

final List<Item> sorted = items.stream() 
     .sorted(Comparator.comparingDouble(Item::getPrice) 
       .thenComparing(
         Item::getCategory, 
         (c1, c2) -> categoryPrioOrder.indexOf(c1) - categoryPrioOrder.indexOf(c2))) 
     .collect(Collectors.toList()); 

System.out.println(sorted); 

Выход будет (в соответствии со спецификацией OPS):

[Item: [Blouse C 17.95 21], Item: [Blouse W 17.95 21], Item: [Blouse M 17.95 21], Item: [Blouse W 20.95 21]]

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

  • Нет связанных вопросов^_^