자바 컬렉션의 정렬 문제에 대해 간단히 이야기하다

6498 단어 javacollection정렬
이것은list,set,map의 정렬을 토론하는데, 맵의value에 따라 정렬하는 것을 포함한다.
1) list 정렬
list 정렬은 Collections의sort 방법을 직접 사용할 수도 있고,Arrays의sort 방법을 사용할 수도 있습니다. 결국 Collections는Arrays를 호출하는sort 방법입니다.

public static <T> void sort(List<T> list, Comparator<? super T> c) { 
  Object[] a = list.toArray(); 
  Arrays.sort(a, (Comparator)c); 
  ListIterator i = list.listIterator(); 
  for (int j=0; j<a.length; j++) { 
    i.next(); 
    i.set(a[j]); 
  } 
  } 
사용자 정의 대상이라면Comparable 인터페이스를 실현하여 대상 자체에'비교'기능을 가져야 한다. 물론 우리는 외부에서Comparator를 사용하여 정렬을 규정할 수 있다.
예:

package com.fox; 
 
/** 
 * @author huangfox 
 * @desc 
 */
public class User implements Comparable<User> { 
 
  private String name; 
  private int age; 
 
  public User() { 
  } 
 
  public User(String name, int age) { 
    super(); 
    this.name = name; 
    this.age = age; 
  } 
 
  @Override
  public String toString() { 
    return "name:" + name + ",age:" + age; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public int getAge() { 
    return age; 
  } 
 
  public void setAge(int age) { 
    this.age = age; 
  } 
 
  @Override
  public int compareTo(User o) { 
    if (o.age < this.age) 
      return 1; 
    else if (o.age > this.age) 
      return -1; 
    else
      return 0; 
  } 
 
  /** 
   * @param args 
   */
  public static void main(String[] args) { 
    User u1 = new User("fox", 11); 
    User u2 = new User("fox2", 21); 
    System.out.println(u2.compareTo(u1)); 
  } 
 
}
정렬:

// List<User> us = new ArrayList<User>(); 
    List<User> us = new LinkedList<User>(); 
    us.add(new User("f5", 12)); 
    us.add(new User("f2", 22)); 
    us.add(new User("f3", 2)); 
    us.add(new User("f4", 14)); 
    us.add(new User("f5", 32)); 
    us.add(new User("f4", 12)); 
    us.add(new User("f7", 17)); 
    us.add(new User("f8", 52)); 
    System.out.println(us.toString()); 
    long bt = System.nanoTime(); 
    Collections.sort(us, new Comparator<User>() { 
 
      @Override
      public int compare(User o1, User o2) { 
        if (o1.getAge() < o2.getAge()) 
          return -1; 
        else if (o1.getAge() > o2.getAge()) 
          return 1; 
        else
          return o1.getName().compareTo(o2.getName()); 
      } 
    }); 
    long et = System.nanoTime(); 
    System.out.println(et - bt); 
    System.out.println(us.toString());
물론 여기는 직접 컬렉션이 가능합니다.sort(us), 여기에서 Comparator로 사용자 자신에 대한 비교 방법인compareTo로 약간의 최적화를 하였습니다(같은 나이의 사람에게는 사용자 이름에 따라 정렬하고 String의 정렬).
간단하게 말하자면, Arrays의 정렬은 삽입 정렬과 병합 정렬을 사용하는데, 수조의 길이가 시간에 비해 직접 정렬을 삽입한다.
2) set 정렬
set은 HashSet과 TreeSet을 포함하고 HashSet은 HashMap을 바탕으로 하고 TreeSet은 TreeMap을 바탕으로 한다.
TreeMap은 붉은색과 검은색 나무로 이루어져 천연적으로 정렬 기능을 가진다.'천연은 정렬 기능을 가진다'는 것은 상승 순서와 하락 순서를 가진 교체기를 가리킨다.
그럼 해쉬셋은 어떻게 정렬을 해요?HashSet을 List로 변환한 다음 List로 정렬할 수 있습니다.
예:

Set<User> us = new HashSet<User>(); 
    // Set<User> us = new TreeSet<User>(); 
    // Set<User> us = new TreeSet<User>(new Comparator<User>() { 
    // 
    // @Override 
    // public int compare(User o1, User o2) { 
    // if (o1.getAge() < o2.getAge()) 
    // return -1; 
    // else if (o1.getAge() > o2.getAge()) 
    // return 1; 
    // else 
    // return o1.getName().compareTo(o2.getName()); 
    // } 
    // }); 
    us.add(new User("f5", 12)); 
    us.add(new User("f2", 22)); 
    us.add(new User("f3", 2)); 
    us.add(new User("f4", 14)); 
    us.add(new User("f5", 32)); 
    us.add(new User("f4", 12)); 
    us.add(new User("f7", 17)); 
    us.add(new User("f8", 52)); 
    // set -> array 
    List<User> list = new ArrayList<User>(us); 
    System.out.println(list); 
    Collections.sort(list); 
    System.out.println(list);
HashSet을 그룹으로 변환하여 Arrays로 정렬할 수도 있습니다.
3) 맵 정렬
맵은 HashMap과 TreeMap을 포함하는데 위에서 언급한 바와 같이 TreeMap은 붉은색과 검은색 나무로 이루어져 천연적으로 정렬 기능을 가지고 있다.
그럼 Hash Map은 어떻게 "key"를 눌러서 정렬합니까?방법은 간단합니다. HashMap으로 TreeMap을 구성합니다.

Map<String, Integer> us = new HashMap<String, Integer>(); 
    // Map<String, Integer> us = new TreeMap<String, Integer>(); 
    us.put("f1", 12); 
    us.put("f2", 13); 
    us.put("f5", 22); 
    us.put("f4", 42); 
    us.put("f3", 15); 
    us.put("f8", 21); 
    us.put("f6", 123); 
    us.put("f7", 1); 
    us.put("f9", 19); 
    System.out.println(us.toString()); 
    System.out.println(new TreeMap<String, Integer>(us));
어떻게 "value"에 따라 정렬합니까?

//  value  
    Set<Entry<String, Integer>> ks = us.entrySet(); 
    List<Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>( 
        ks); 
    Collections.sort(list, new Comparator<Entry<String, Integer>>() { 
 
      @Override
      public int compare(Entry<String, Integer> o1, 
          Entry<String, Integer> o2) { 
        if (o1.getValue() < o2.getValue()) 
          return -1; 
        else if (o1.getValue() > o2.getValue()) 
          return 1; 
        return 0; 
      } 
    }); 
    System.out.println(list);
맵의 Entry를 set 구조로 제시한 다음 set를list로 바꾸고 마지막으로list에 따라 정렬합니다.
이상의 이 간단한 자바 컬렉션의 정렬 문제는 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기