2015-05-26 3 views
0

У меня есть следующие объекты:Java объекта сортировать по типу списку недвижимости

public class Shipping { 
    String name; 
    List<Method> methods; 
} 

public class Method { 
    String serviceType; 
    String cost; 
} 

у меня есть:

List<Shipping> shippings; 

Я хотел бы отсортировать доставку по методе, который возвратил самую дешевую стоимость.

Пример:

shipping: "Josh" with 2 methods: "Premium","5" and "Basic","3" 
shopping: "Nash" with 2 methods: "Prem", "7" and "Base","2" 

сортирует это так:

shopping: "Nash" with 2 methods: "Base","2" and "Prem", "7" 
shopping: "Josh" with 2 methods: "Basic","3" and "Premium","5" 

мне это нужно, чтобы вернуть метод, который имеет самую дешевую стоимость метода, как и первый, в то время как сортировку также методы, чтобы иметь самый дешевый первый.

Каков наилучший способ сделать это? Я с помощью Java 8, если у него есть лучшее решение, и есть guava библиотека

EDIT: стоимость является числом с плавающей точкой. Мне нужно оставить его как String, поскольку это объект, который я передаю в REST api и не хотел бы, чтобы клиентская сторона разбирала его.

ответ

3

Будем считать все отгрузок, по крайней мере, 1 метод.Поэтому вы хотите, чтобы методы сортировки сортировались по стоимости. Так давайте сделаем это:

shippings.forEach(shipping -> { 
    shipping.getMethods().sort(Comparator.comparing(Method::getCost)); 
}); 

Затем вы хотите список отгрузок быть отсортирован по низкой стоимости их методов. Самая низкая стоимость является стоимость первого метода, так как они теперь сортируется:

shippings.sort(Comparator.comparing(shipping -> shipping.getMethods().get(0).getCost())); 

Обратите внимание, что это предполагает, что вы хотите, затраты можно сравнить лексически. Если, как я подозреваю, стоимость фактически является числом, то она должна храниться как таковая в классе Method, а не как String. Поэтому сделайте его Integer или BigDecimal, или независимо от типа.

+0

да - стоимость - поплавок. но я предпочел бы сохранить его как String, поскольку это объект, который я передаю в REST api, и не хотел бы, чтобы клиентская сторона разбирала его. В этом случае - как вы предлагаете написать его? – Dejell

+0

Если это поплавок, оставьте его как поплавок. Почему клиент должен разбирать номер? Сделав его строкой, вы делаете жизнь клиента более сложной: она снова должна преобразовать строку в JSON в число. Во всяком случае, если вы действительно хотите сделать это плохо, то проанализируйте строку при поплавке при сравнении. То есть замените 'Comparator.comparing (Method :: getCost)' на 'Comparator.comparingDouble (метод -> Double.parseDouble (method.getCost())) –

+0

Спасибо - клиентская сторона просто отображает его и не преобразует его , он не делает никаких расчетов. Я где-то читал, что объекты отдыха должны быть обработаны так, чтобы стороне клиента не нужно было снова их редактировать. – Dejell

1

Вам нужно либо компаратор или реализовать Сопоставимые по методу класса, как:

public class Method implements Comparable<Method> { 
    public int compareTo(Method thatMethod) { 
     return Integer.compare(Integer.parseInt(this.cost), Integer.parseInt(thatMethod.getCost()));//if you need name then you could do this.cost.compareTo(thatMethod.getServiceType()); assuming serviceType can never be null 
    } 
} 

, а затем отсортировать список, как:

Collections.sort(methods); 
+0

Поскольку строки в java действительно сопоставляются лексикографически, вы также можете избежать разбора на Integer и использовать 'this.cost.compareTo (other.getCost())' –

+1

@francescoforesti Нет, лексикографическое упорядочение нежелательно для чисел. Лексикографические средства, например. '9' больше, чем' 10'. – Radiodef

+0

@Radiodef Вы правы! Но тогда реальная проблема заключается в том, что 'String' не подходит для такого типа данных. –

0

Я рекомендую вам прочитать в Java заказа tutorial. Ваши требования, похоже, указывают на то, что вы хотите отсортировать каждый экземпляр Shipping по его Method, а в другом месте вы хотите отсортировать коллекцию Shipping экземпляров, которые вы хотите отсортировать в алфавитном порядке, но это не совсем ясно из написанного вами.

В любом случае, это просто, когда вы читаете учебник. Таким образом, вы можете сделать это с помощью Comparator или путем реализации Comparable и просто вызвать Collections.sort (...) в вашем наборе данных.

1

Вы можете сначала отсортировать methods поле каждого Shipping экземпляра в вашем shippings списке, а затем отсортировать shippings список, первым элементом methods списка каждого экземпляра:

for (Shipping shipping : shippings) 
    shipping.methods.sort((m1, m2) -> Integer.compare(m1.cost, m2.cost)); 

shippings.sort((s1, s2) -> 
    Integer.compare(s1.methods.get(0).cost, s2.methods.get(0).cost)); 

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

+0

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

+0

@Dejel Это будет просто 'Double.compare' вместо' Integer.compare'. – arshajii

1

Вы можете определить новый Comparator определить свои критерии сортировки, как это:

Comparator<Shipping> shippingComparator = new Comparator<Shipping>{ 
public int compare(Shipping obj1, Shipping obj2) { 
    //your rules for comparing Shipping1, Shipping 2 goes here 
    //return -1 when obj1 should be before obj2 
    //return 1 when obj1 should be after obj2 
    //return 0 when obj1 is equal to obj2 and relative position doesnt matter 
} 

Затем используйте этот компаратор отсортировать список:

ArrayList<Shipping> shippings; 
//populate List 
Collections.sort(shippings, shippingComparator); 
+0

Я не понял, как написать сравнение методов – Dejell

+0

'shippingComparator' предназначен для сортировки. Внутри компаратора вам придется перебирать список 'methods', узнать минимальную стоимость, а затем сравнить эту козу с другими объектами минимум. Основание на этом сравнении возвращает 1,0, -1. Например, получите минимальную стоимость в Obj 1 и сравните ее с минимальной стоимостью Obj 2. – hitz

+0

Если вы хотите сортировать и в списке 'methods', вы можете определить аналогичный компаратор для' shippingComparator' для типа 'Method' на этот раз и использовать этот компаратор сортирует 'методы' список. – hitz

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