为什么我不能比较两个 Hashmap
Why can't I compare two Hashmaps
在我的代码中,我需要一个包含两个值的队列,我将它们作为键和值存储在 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)
下面是我的代码所做的描述,然后是代码本身:
Randomizer 的工作是生成一系列正随机整数,并通过分布式整数队列将它们发送给 Prime。
Primes 的工作是接收整数并计算整数是否为素数,并通过分布式队列 return 对 Randomizer 的回答(只是一个 java 队列实现,不需要实现 JMS 等)包含原始数字和布尔值;哪个 Randomizer 将打印到系统输出。
随机化器Class:
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);}
}
}
总理 Class:
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;
}
}
你的问题是 PriorityQueue 试图将两个 HashMap 相互比较,但它们没有有意义的比较方式。
我建议您使用这样的值持有者 class:
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;
}
}
}
在我的代码中,我需要一个包含两个值的队列,我将它们作为键和值存储在 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)
下面是我的代码所做的描述,然后是代码本身:
Randomizer 的工作是生成一系列正随机整数,并通过分布式整数队列将它们发送给 Prime。 Primes 的工作是接收整数并计算整数是否为素数,并通过分布式队列 return 对 Randomizer 的回答(只是一个 java 队列实现,不需要实现 JMS 等)包含原始数字和布尔值;哪个 Randomizer 将打印到系统输出。
随机化器Class:
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);}
}
}
总理 Class:
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;
}
}
你的问题是 PriorityQueue 试图将两个 HashMap 相互比较,但它们没有有意义的比较方式。
我建议您使用这样的值持有者 class:
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;
}
}
}