2013-06-20 1 views
0

Я выброшен вместе образуют SSCCE здесь:Как отсортировать объекты HashSet на основе этих критериев?

House.java:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class House { 

    private Status currentStatus; 
    private String city; 
    private Date date; 

    public enum Status { AVAILABLE, 
         SOLD, 
         CONTINGENT 
    } 

    public House(Status s, String c, String d) throws ParseException { 
     currentStatus = s; 
     city = c; 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     date = sdf.parse(d); 
    } 
} 

SortingTest.java:

import java.text.ParseException; 
import java.util.HashSet; 
import sortingtest.House.Status;  

public class SortingTest { 


    public static void main(String[] args) throws ParseException { 
     HashSet<House> houses = new HashSet<House>(); 
     houses.add(new House(Status.AVAILABLE, "New York City", "2007-11-11")); 
     houses.add(new House(Status.SOLD, "Los Angeles", "2005-06-11")); 
     houses.add(new House(Status.AVAILABLE, "Chicago", "2012-05-03")); 
     houses.add(new House(Status.CONTINGENT, "Portland", "2007-10-11")); 

     //Sort HashSet of House objects by criteria listed below  

     //sort by Status.AVAILABLE 
      //call sort 
      //System.out.println("Sorted by available"); 
      //iterate set and print out sorted houses 

     //sort by Status.SOLD 
      //call sort 
      //System.out.println("Sorted by sold"); 
      //iterate set and print out sorted houses 

     //sort by Status.CONTINGENT 
      //call sort 
      //System.out.println("Sorted by contingent"); 
      //iterate set and print out sorted houses 

     //sort by City 
      //call sort 
      //System.out.println("Sorted alphabetically by City"); 
      //iterate set and print out sorted houses 

     //sort by City 
      //call sort 
      //System.out.println("Sorted reverse alphabetically by City"); 
      //iterate set and print out sorted houses 

     //sort by Date (newest) 
      //call sort 
      //System.out.println("Sorted by newest date (fewest days on market)"); 
      //iterate set and print out sorted houses 

     //sort by Date (oldest) 
      //call sort 
      //System.out.println("Sorted oldest date (most days on market)"); 
      //iterate set and print out sorted houses 
    } 
} 

Так в конечном счете, я хотел создать SetSorter класс, где я могу просто вызвать метод, который вернет Set, отсортированный в определенном формате.

В случае, если вы не хотите, чтобы прочитать комментарии в коде, я желающих сортировать на основе:

  • Status.AVAILABLE
  • Status.SOLD
  • Status.Contingent
  • Город (по алфавиту)
  • Город (реверс по алфавиту)
  • Дата (наименьшее количество дней на рынке)
  • Дата (большинство дней на рынке)

Я сделал немного читать на нем, и это выглядит, как люди предлагают сделать это в TreeSet для сортировки и с помощью компаратора. Я видел несколько примеров, когда люди либо создают отдельный класс только для компаратора, либо делают сопоставление указанного класса.

То, что я еще не видел, это кто-то пишет дополнительный класс для обработки всей сортировки. Это возможно? Если да, может кто-нибудь покажет мне, с чего начать? Они кажутся немного более сложными сравнениями, чем типичные целые сравнения.

Edit для осветления

При сортировке по Status.AVAILABLE Я хотел бы, чтобы иметь набор объектов появляются на:

  • Status.AVAILABLE (сверху/первый)
  • Status.CONTINGENT (после статуса. НАЛИЧИЕ/в секундах)
  • Status.SOLD (после Status.CONTINGENT/последний)

При сортировке по Status.CONTINGENT Я хочу набор отсортированных следующим образом:

  • Status.CONTINGENT
  • Status.SOLD
  • Status.AVAILABLE

При сортировке по Статус.ПРОДАНО Я хочу набор отсортированных следующим образом:

  • Status.SOLD
  • Status.CONTINGENT
  • Status.AVAILABLE

Edit # 2 Конечная цель:

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

Ie:

//sort by date 
SetSorter.sortByData(treeSet); //returns TreeSet sorted by date 

//sort by city 
SetSorter.sortByCity(treeSet); //returns TreeSet sorted by City 

//sort by other criteria 

Edit # 3

class SortByCity implements Comparator<House> { 
    @Override 
    public int compare(House h1, House h2) { 
     return h1.getCity().compareTo(h1.getCity()); 
    } 
} 


houses = new TreeSet(new SortByCity()); 

Я думаю, что это будет простой способ сделать это, но они все были бы маленькие классы и (на мой взгляд) выглядят беспорядочно. Кто хочет иметь 7 мини-классов внутри .java?

Может ли кто-нибудь предоставить мне несколько альтернативных примеров?

+0

Что вы подразумеваете под своим профилем на основе 'Status.AVAILABLE'? Это перечисление? –

+0

@RohitJain Я имею в виду, все 'Status.AVAILABLE' в верхней части набора. Я отредактирую свой пост, чтобы уточнить. – WilliamShatner

+0

Используйте «TreeSet» и предоставьте «Компаратор ». –

ответ

1

Вот несколько примеров сортировки. Я не выполнял сортировку даты или обратного алфавита (это назначение). Обратите внимание на встроенный комментарий о сравнении двух домов для значения 0!

public class HouseSorter { 

    enum Status { 
     SOLD, AVAILABLE, CONTINGENT; 
    } 

    /** 
    * Immutable house (if a house is sold or not does not change a house, use a 
    * Map instead). 
    */ 
    private static class House { 
     private final String city; 

     House(String city) { 
      this.city = city; 
     } 

     public String getCity() { 
      return city; 
     } 

     @Override 
     public String toString() { 
      return "House in " + city; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (obj == null) { 
       return false; 
      } 
      if (!House.class.isAssignableFrom(obj.getClass())) { 
       return false; 
      } 
      return this.city.equalsIgnoreCase(((House) obj).city); 
     } 

     @Override 
     public int hashCode() { 
      return city.hashCode(); 
     } 
    } 

    public static SortedSet<House> sortAlphabetically(Set<House> houses) { 
     TreeSet<House> sortedHouses = new TreeSet<House>(
       new Comparator<House>() { 
        @Override 
        public int compare(House o1, House o2) { 
         return o1.getCity().compareTo(o2.getCity()); 
        } 
       }); 
     sortedHouses.addAll(houses); 
     return sortedHouses; 
    } 

    public static SortedSet<House> sortByStatus(
      final Map<House, Status> houseStatusMap) { 
     TreeSet<House> sortedHouses = new TreeSet<House>(
       new Comparator<House>() { 
        @Override 
        public int compare(House o1, House o2) { 
         int compareByStatus = houseStatusMap.get(o1).compareTo(
           houseStatusMap.get(o2)); 
         if (compareByStatus != 0) { 
          return compareByStatus; 
         } 
         // you need an additional compare, until none of the 
         // houses compare with result 0 
         // otherwise the houses would be equal and therefore 
         // removed from the set 
         return o1.getCity().compareTo(o2.getCity()); 
        } 
       }); 
     sortedHouses.addAll(houseStatusMap.keySet()); 
     return sortedHouses; 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     final Map<House, Status> houseStatusMap = new HashMap<House, Status>(); 
     House house0 = new House("Beverwijk"); 
     houseStatusMap.put(house0, Status.SOLD); 
     House house1 = new House("Opmeer"); 
     houseStatusMap.put(house1, Status.SOLD); 
     House house2 = new House("Amstelveen"); 
     houseStatusMap.put(house2, Status.AVAILABLE); 
     House house3 = new House("Haarlem"); 
     houseStatusMap.put(house3, Status.CONTINGENT); 

     System.out.println(sortAlphabetically(houseStatusMap.keySet())); 
     System.out.println(sortByStatus(houseStatusMap)); 
    } 
} 
+0

Спасибо за пример, у меня не было времени проверить его (я буду завтра). Является ли карта обязательной для статуса просто потому, что я хочу сравнить ее несколькими способами? Если вместо этого я хотел сортировать его по порядку перечисления, мне все еще нужна карта для сравнения? Опять же, спасибо за ** отличный пример!Я также попытаюсь найти пример компаратора данных – WilliamShatner

+0

Нет, это объектно-ориентированный дизайн. Я не думаю, что «в основном» говоря, статус дома не является частью самого дома. Вероятно, дверь, окна тоже, но маленький знак снаружи нет. –

+0

Еще раз спасибо за пример. Это действительно помогло мне понять, как работают эти компараторы. У меня проблемы с сортировкой по статусу, хотя (как вы указали в своем коде, мне нужны дополнительные проверки). Если я просто хочу заказать его по порядку, как бы выглядели мои чеки? – WilliamShatner