2013-08-25 3 views
0

지도에서 값과 키를 정렬하는 데 문제가 있습니다 (정수 및 문자열).모음 정렬 <V> 및 집합 <K>

public Collection<V> values(){ 
    Collection<V> coll = new LinkedList<V>(); 
    for(int i = 0; i < table.length; i++){ 
     if(table[i] != null){ 
      for(Entry<K, V> nextItem : table[i]){ 
       if(nextItem.value != null){ 
        if(!coll.contains(nextItem.value)){ 
         coll.add(nextItem.value); 
        } 
       } 
      } 
     } 
    } 
    return coll; 
} 

예상 출력 :

120 123 404 911 999 

내 출력 (기본적으로 유지가 맵에 있던 목적지 순서)

911 999 123 120 404 
여기 두 방법 값 첫번째 방법이다

위의 메소드는 hashTableChain (배열의 인덱스가 linkedLists 인 hashCode로 정렬 된 배열)에 대해 점 표기법과 함께 사용되며 값 f 또는 주어진지도. Collections.sort (coll)를 사용하여 정렬을 시도했지만 Collection과 호환되지 않는 List가 필요합니다. 이미 정렬되었거나 쉬운 방법으로 정렬 될 수있는 Collection과 호환되는 항목이 있습니까? 키의 방법 :

public Set<K> keySet(){ 
    Set<K> coll = new HashSet<K>(); 
    for(int i = 0; i < table.length; i++){ 
     if(table[i] != null){ 
      for(Entry<K, V> nextItem : table[i]){ 
       coll.add(nextItem.key); 
      } 
     } 
    } 
    return coll; 
} 

예상 출력 :

ABC ACTG HTML LOL OMG XYZ 

내 출력 (기본적으로지도에 있었던 곳의 순서 유지) : 내가 컬렉션을 시도 다시

XYZ ABC ACTG HTML LOL OMG 

.sort (coll)를 사용할 수 없으며 정렬 할 방법을 찾을 수 없습니다.

나는 자바에 대해 상당히 익숙하다. 잠깐 동안 웹을 검색 한 후에 뭔가 물어볼 것이라고 확신한다.

미리 감사 드리며 대단히 감사합니다. 요청에

추가 : 당신이 Collection이 사건의 List 100 % 될 일이 부르는

private static class Entry<K, V> implements Map.Entry<K, V> { 

    /** The key */ 
    private K key; 
    /** The value */ 
    private V value; 

    /** 
    * Creates a new key-value pair. 
    * @param key The key 
    * @param value The value 
    */ 
    public Entry(K key, V value) { 
     this.key = key; 
     this.value = value; 
    } 
+0

왜 목록이 컬렉션과 호환되지 않습니까? 목록과 함께 작동해야합니다. 지도에 저장된 값의 데이터 유형은 무엇입니까? – Lokesh

+0

값은 항목 으로 만든 연결 목록입니다. List (및 T)을 Collections = new ...와 함께 사용하고 Collections.sort (coll)를 사용했지만 호환되지 않는 오류가 발생했습니다. 나는 컬렉션에 익숙하지 않아서 내가하는 일을 정말로 모르겠습니다. – Kerher

+0

수업의 회원 선언을 게시 할 수 있습니까? –

답변

3

은 첫 번째 예제에 대해 변수 coll에 대한 List<V>를 사용할 수 있습니다. 여러분은 여러분의 필요에 맞는 상위 유형을 선택해야합니다. 정렬 된 목록을 반환해야하는 경우 함수에서 List을 사용하여 정렬하고 Collection으로 목록을 반환 할 수 있습니다.

번째 예에서는 동일한

하지만

Set<K> coll = new TreeSet<K>(); 

TreeSetSortedSet 구현이 사용, 추가 요소의 동작을 보증하는 세트.

+0

keySet()에서 작동하지만 Collections.sort (coll)를 사용하려고하면 List 과 함께이 작업을 수행 할 수 없다는 오류가 발생합니다. – Kerher

+1

[V는 Comparable을 확장해야합니다.] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort (java.util.List)) 그렇지 않으면 sort (List , Comparator) –

+0

다음과 같이 작동하도록했습니다. 컬렉션.sort (coll, null); – Kerher

2

. 당신은 단지 중 하나가이 컴파일러를 알려줄 필요가 : 당신이 값으로 두 번 123이있는 경우 선언 List<V> coll= new LinkedList<V>() ;

변경 sort, 또는

  • 를 호출하기 전에

    1. (List<V>)coll 주조, 나는 생각 올바른 values()의 결과에 두 번 나타납니다.

      두 번째 경우는 HashSet 대신 SortedSet을 사용하는 것이 좋습니다.

      다음 코드를 고려하십시오 : 당신은 파라 메트릭 유형의 값이 정렬 할 예정되는 제네릭 클래스를 생성 할 것으로 예상되는 경우

      public class Sample<K extends Comparable<K>,V extends Comparable<V>> { 
      
          public static class Entry<A,B> implements Map.Entry<A,B> { 
           A key; 
           B value; 
           public Entry(A key,B value) { 
            this.key= key ; 
            this.value= value ; 
           } 
           public A getKey() { 
            return this.key ; 
           } 
           public B getValue() { 
            return this.value ; 
           } 
           public B setValue(B value) { 
            return this.value= value ; 
           } 
          } 
      
          LinkedList<Entry<K,V>>[] table; 
      
          public Collection<V> values(){ 
      
           List<V> coll= new LinkedList<V>() ; 
           for(LinkedList<Entry<K, V>> e: table) { 
            if(e != null) { 
             for(Entry<K, V> nextItem : e) { 
              if(nextItem.value != null) { 
               coll.add(nextItem.value); 
              } 
             } 
            } 
           } 
           Collections.sort(coll); 
           return coll; 
          } 
          public Set<K> keySet(){ 
      
           Set<K> coll= new TreeSet<K>() ; 
           for(LinkedList<Entry<K, V>> e: table) { 
            if(e != null) { 
             for(Entry<K, V> nextItem : e) { 
              coll.add(nextItem.key); 
             } 
            } 
           } 
           return coll; 
          } 
          public static void main(String... args) { 
      
           Sample<String,Integer> test= new Sample<String,Integer>(); 
           test.table= (LinkedList<Entry<String,Integer>>[])new LinkedList[1024] ; 
           test.table[467]= new LinkedList<Entry<String,Integer>>() ; 
           test.table[467].add(new Entry("XYZ",999)); 
           test.table[467].add(new Entry("ABC",123)); 
           test.table[678]= new LinkedList<Entry<String,Integer>>() ; 
           test.table[678].add(new Entry("ACTG",404)); 
           test.table[678].add(new Entry("HTML",120)); 
           test.table[678].add(new Entry("ACTG",404)); 
           test.table[678].add(new Entry("LOL",123)); 
           test.table[ 2]= new LinkedList<Entry<String,Integer>>() ; 
           test.table[ 2].add(new Entry("OMG",911)); 
      
           System.out.println(test.values()); 
           System.out.println(test.keySet()); 
          } 
      } 
      

      을, 그들은 인터페이스 Comparable를 구현해야합니다.그리고 그들이 인터페이스 Comparable을 구현해야한다면, 클래스를 선언 할 때 그렇게 말할 필요가 있습니다. 그렇기 때문에 K extends Comparable<K>V extends Comparable<V>Sample으로 선언됩니다. Collections.sort으로 전화를 걸거나 TreeSet을 인스턴스화 할 때 특히 중요합니다. 둘 다 매개 변수/매개 변수 유형이 Comparable (또는의 부속 유형)이어야합니다.

      I 추가 테스트 케이스의 결과는 정확 : 각각

      [120, 123, 123, 404, 404, 911, 999] 
      [ABC, ACTG, HTML, LOL, OMG, XYZ] 
      

      . LinkedListList를 구현하므로,

      public Collection<V> values(){ 
          List<V> coll = new LinkedList<V>(); 
          // do stuff 
          Collections.sort(coll); 
          return coll; 
      } 
      

      을하고 올바른 :

  • +0

    메서드가 전달되지 않을 때 addAll()을 어떻게 사용합니까? 또한 List 이 컬렉션과 호환되지 않는다는 오류가 발생합니다 (추측 된 유형 V는 바운드 된 매개 변수 > 대신 유효합니다) – Kerher

    +0

    내 이해를 위해 Map.Entry 확장)은 비교 가능을 구현하고 재정의되지 않으므로 여전히 유효해야합니다. – Kerher

    +0

    @Kerher 일반 LinkedList에 대해 이야기하는 것이 아니라 자신이 구현 한 것을 알았 기 때문에이 주석을 삭제했습니다. 희망을 가지고 당신의 반원들을 올바르게 이해했으면합니다. 마지막 단락에서 두 번째 요점을 설명했습니다. –