2017-04-11 5 views
-1

내 코드에서 HashMap에 키와 값으로 저장하는 두 개의 값 대기열이 있어야합니다.두 개의 해시 맵을 비교할 수없는 이유

랜덤 마이저의 작업의 시리즈를 생성하는 것입니다 : 여기

Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable 
     at java.util.PriorityQueue.siftUpComparable(Unknown Source) 
     at java.util.PriorityQueue.siftUp(Unknown Source) 
     at java.util.PriorityQueue.offer(Unknown Source) 
     at java.util.PriorityQueue.add(Unknown Source) 
     at com.n2s.StringsPractise.Prime.primeCheck(Prime.java:32) 
     at com.n2s.StringsPractise.Randomizer.main(Randomizer.java:22) 

내 코드가 무엇을 설명하고 코드 자체입니다 : 내가 대기열에지도를 넣어 그러나 나는이 예외가 양수의 무작위 정수를 생성하고 정수의 분산 대기열을 통해 프라임에 보냅니다. 소수 직업은 정수를 수신하고 정수가 소수인지 여부를 계산하고 분산 된 대기열 (Java 대기열 구현, JMS 구현 필요 없음)을 통해 Randomizer에 응답을 반환하는 것입니다.이 수는 원래 숫자와 부울 ; 어떤 Randomizer는 시스템에 출력 할 것입니다.

랜덤 마이저 등급 :

public class Randomizer{ 

    static Queue<Integer> q = new PriorityQueue<Integer>(); 
    public static Queue<Integer> randomGenerate(){ 
     int num = 0; 
     Random rand = new Random(); 
     for(int k = 0; k < 10; k++){ 
     num = rand.nextInt(Integer.MAX_VALUE); 
     q.add(num); 
     num = 0; 
     } 
     return q; 
    } 
    public static void main(String[] args){ 
     Queue<HashMap<Integer, String>> outQ = Prime.primeCheck(randomGenerate()); 
     System.out.println(outQ);} 
    } 
} 

프라임 등급 :

public class Prime{ 
    Randomizer rn = new Randomizer(); 
    static HashMap<Integer, String> map = new HashMap<Integer, String>(); 
    static Queue<HashMap<Integer, String>> primeQ = new PriorityQueue<HashMap<Integer, String>>(); 

    public static Queue<HashMap<Integer, String>> primeCheck(Queue<Integer> q){ 
      boolean flag = false; 
      Iterator<Integer> itr = q.iterator(); 
       while(itr.hasNext()){ 
        int item = (int) itr.next(); 
        int srt = (int) Math.sqrt((double) item); 
        if (item==1) { 
          flag = true; 
         } else{ 
         for(int i=2;i<=srt;i++){ 

          if(item % i == 0) flag = false;   
         } 
         flag = true; 
         } 
        if(flag == true) 
        map.put(item, "Prime"); 
        else map.put(item, "Not Prime"); 

        primeQ.add(map); 

       } 
       return primeQ;    
      } 
} 
+1

HashMap에 따라서 Comparable 인터페이스를 구현하지 않습니다에 심지어 대등은 compareTo() –

+0

에 캐스트 할 수없는 당신은 논리 오류가 있습니다 뭔가가 아닌 경우 프라임, 너 set flag = false, 그리고 그 직후 flag = true. –

+0

구현 한 후 해결할 수없는 대등 –

답변

0

귀하의 문제는 PriorityQueue 인은 서로 두 HashMaps을 비교하려고한다는 것입니다,하지만 그들은 비교되는 의미있는 방법이 없습니다. 전체 코드는 다음과 같을 것이다 그런

public class Value implements Comparable<Value> { 

    int item; 
    boolean isPrime; 

    public Value(int item, boolean isPrime) { 
     this.item = item; 
     this.isPrime = isPrime; 
    } 

    @Override 
    public int compareTo(Value o) { 
     if (o == null) { 
      return 1; 
     } 
     return this.item - o.item; 
    } 

    @Override 
    public String toString() { 
     return "Value{" + "item=" + item + ", isPrime=" + isPrime + '}'; 
    } 
} 

:

나는이 같은 값 홀더 클래스를 사용하는 것이 좋습니다 내 댓글에 언급 된 (나는 그것을 정리하고 논리 문제를 해결의 자유를했다 질문)

public class DLH { 

    public static void main(String[] args) { 
     Randomizer ran = new Randomizer(); 
     Queue<Value> outQ = new Prime().primeCheck(ran.randomGenerate()); 
     System.out.println(outQ); 
    } 

    private static class Value implements Comparable<Value> { 

     int item; 
     boolean isPrime; 

     public Value(int item, boolean isPrime) { 
      this.item = item; 
      this.isPrime = isPrime; 
     } 

     @Override 
     public int compareTo(Value o) { 
      if (o == null) { 
       return 1; 
      } 
      return this.item - o.item; 
     } 

     @Override 
     public String toString() { 
      return "Value{" + "item=" + item + ", isPrime=" + isPrime + '}'; 
     } 
    } 

    private static class Prime { 

     Queue<Value> primeQ = new PriorityQueue<>(); 

     public Queue<Value> primeCheck(Queue<Integer> q) { 
      boolean flag; 
      Iterator<Integer> itr = q.iterator(); 
      while (itr.hasNext()) { 
       Value val; 
       int item = (int) itr.next(); 
       int srt = (int) Math.sqrt((double) item); 
       if (item == 1) { 
        flag = true; 
       } else { 
        flag = true; 
        for (int i = 2; i <= srt; i++) { 

         if (item % i == 0) { 
          flag = false; 
         } 
        } 
       } 
       val = new Value(item, flag); 

       primeQ.add(val); 

      } 
      return primeQ; 
     } 
    } 

    private static class Randomizer { 

     public Queue<Integer> randomGenerate() { 
      Queue<Integer> q = new PriorityQueue<>(); 
      int num; 
      Random rand = new Random(); 
      for (int k = 0; k < 10; k++) { 
       num = rand.nextInt(Integer.MAX_VALUE); 
       q.add(num); 
      } 
      return q; 
     } 
    } 
}