2016-11-07 15 views
0

У меня есть JsonArray, который имеет огромное количество «ID» и «жанр», который будет random.The образец JSON массив ниже:Как отсортировать JsonArray на основе нескольких значений в java?

{ 
    "category": [ 
     { "Id":"23" , "Genre":"English News" }, 
     { "Id":"43" , "Genre":"Entertainment" }, 
     { "Id":"255" , "Genre":"Music" }, 
     { "Id":"553" , "Genre":"Games" }, 
     { "Id":"97" , "Genre":"regional" } 
    ] 
} 

Мне нужна эта jsonarray, чтобы получить отсортированные на основе:

(1.Music 2.Игры 3.Региональные 4.Интернет-новости 5.Развлечения) Этот заказ.

Как получить этот массив json отсортированный? Существует ли какая-либо сторонняя библиотека для использования?

Любая помощь будет оценена :)

ответ

0

Вы можете создать несколько Компараторы и может использовать любой из компаратора при сортировке.

public class ComparatorsGroup { 
       public static Comparator<Item> IdComparator = new Comparator<Item>() { 
        public int compare(Item item1, Item item2) { 
        return item1.getId().compareTo(item2.getId()); 
        } 
      }; 

      public static Comparator<Item> GenreComparator = new Comparator<Item>() { 
        public int compare(Item item1, Item item2) { 
        return item1.getGenre().compareTo(item2.getGenre()); 
        } 
      }; 
} 

При вызове метода сортировки вы можете передать любой из компараторов в зависимости от требуемой сортировки.

Collections.sort(myList, ComparatorsGroup.GenreComparator); 

Для получения более подробной информации вы можете взглянуть на приведенный ниже пример MkYong.

Java object sorting example (Comparable and Comparator)

0

Вам придется написать несколько компараторов здесь т.е. компаратор для каждого поля, которое необходимо отсортировать по, а затем цепь тех компаратор в последовательности, которую вы хотите. Передайте этот список компараторов в базовый compartor, где в методе сравнения вы будете зацикливаться на этих компараторах и называть их методом сравнения. Что-то, как показано ниже:

[Pseduo Code]

public class BaseComparator implements 
      Comparator<Map<String, String>> { 

     public List<Comparator<Map<String, String>>> listComparators; 

     public BaseComparator(
       List<Comparator<Map<String, String>>> comparators) { 
      this.listComparators = comparators; 
     } 

     @Override 
     public int compare(Map<String, String> obj1, Map<String, String> obj2) { 
      for (Comparator<Map<String, String>> comparator : listComparators) { 
       int result = comparator.compare(obj1, obj2); 
       if (result != 0) { 
        return result; 
       } 
      } 
      return 0; 
     } 
    } 

Collections.sort(list, 
       OpportunitySorter.getBaseComparator(SortDefinition)); 
0

Для простоты использования, я использовал Джексон и я бегу JDK-8. Это рабочая ревизия кода. Зависимости:

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.8.4</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.4</version> 
    </dependency> 


import com.fasterxml.jackson.databind.ObjectMapper; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class JsonSorter { 
    public static void main(String[] args) throws Exception { 

     //1.Music 2.Games 3.Regional 4.English news 5.Entertainment 
     final Map<String, Integer> customSort = new HashMap<String, Integer>(); 
     customSort.put("Music", new Integer(1)); 
     customSort.put("Games", new Integer(2)); 
     customSort.put("Regional", new Integer(3)); 
     customSort.put("English news", new Integer(4)); 
     customSort.put("Entertainment", new Integer(5)); 

     String jsonString = "{\"category\": [{ \"Id\":\"23\" , \"Genre\":\"English News\" },{ \"Id\":\"43\" , \"Genre\":\"Entertainment\" },{ \"Id\":\"255\" , \"Genre\":\"Music\" },{ \"Id\":\"553\" , \"Genre\":\"Games\" },{ \"Id\":\"97\" , \"Genre\":\"regional\" }]}"; // Load this in whatever way makes sense for you 
     ObjectMapper mapper = new ObjectMapper(); 
     Map<String, Object> parsedJson = mapper.readValue(jsonString, Map.class); 
     List<Map<String, String>> genres = (List) parsedJson.get("category"); 
     genres.stream().sorted((thisMap, thatMap) -> customSort.get(thisMap.get("Genre")).compareTo(customSort.get(thatMap.get("Genre")))); 
     genres.stream().forEach(System.out::println); 
    } 
}