gpt4 book ai didi

java - 我对 Collections.sort 和 Map 的 Java 泛型的使用无法编译

转载 作者:行者123 更新时间:2023-12-02 03:23:40 24 4
gpt4 key购买 nike

我正在处理用户数据,按一些外部短语对用户进行分组并按(外部短语、用户名)排序。我正在 Java 中执行此操作,并尝试使短语对象和用户对象变得通用。我的目标是 Java 6。

尽管一切都是通用的,但在此示例中,外部短语是字符串,用户的类型是 JUser。我的代码拒绝编译,因为 Collections.sort() 和 Map.put() 存在问题。

J用户:

import java.util.*;
public class JUser implements Comparable<JUser> {
private String name = "";

public JUser(String name) {
setName(name);
}

public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public int compareTo(JUser other) { return this.getName().compareTo(other.getName()); }
}

J标签:

public class JLabeled<K, V> {
private K label = null;
private V value = null;

public JLabeled(K label, V value) {
this.label = label;
this.value = value;
}

public K getLabel() { return this.label; }
public V getValue() { return this.value; }
}

J整理:

import java.util.*;

public class JCollated<K, V> {
private Map<K, List<V>> keyedList = new HashMap<K, List<V>>();

public <V> List<JLabeled<K, V>> getAll() {
List<JLabeled<K, V>> labeled = new ArrayList<JLabeled<K, V>>();
List<K> keys = new ArrayList<K>(keyedList.keySet());
java.util.Collections.sort(keys);
for(K key : keys) {
List<V> values = keyedList.get(key);
java.util.Collections.sort(values);
for(V value : values) labeled.add(new JLabeled<K, V>(key, value));
}
return labeled;
}

public <K, V> void createKey(K key) {
if(keyedList.get(key) == null) keyedList.put(key, new ArrayList<V>());
}
}

J测试:

import java.util.*;
public class JTest {

public static void main( String[] args ) {
System.out.println("hello from JTest\n\n");
testStuff();
System.out.println("\n\ngoodbye from JTest\n");
}

public static void testStuff() {
JCollated<String, List<JUser>> myCollated = new JCollated<String, List<JUser>>();
List<JLabeled<String, JUser>> labeledList = myCollated.getAll();

for(JLabeled<String, JUser> labeled : labeledList) {
JUser user = labeled.getValue();
System.out.println("Key: " + labeled.getLabel() + ", name: " + user.getName());
}
}
}

编译javac JTest.java时,编译器显示:

.\JCollated.java:9: cannot find symbol
symbol : method sort(java.util.List<K>)
location: class java.util.Collections
java.util.Collections.sort(keys);
^
.\JCollated.java:11: incompatible types
found : java.util.List<V>
required: java.util.List<V>
List<V> values = keyedList.get(key);
^
.\JCollated.java:12: cannot find symbol
symbol : method sort(java.util.List<V>)
location: class java.util.Collections
java.util.Collections.sort(values);
^
.\JCollated.java:19: put(K,java.util.List<V>) in java.util.Map<K,java.util.List<V>> cannot be applied to (K,java.util.ArrayList<V>)
if(keyedList.get(key) == null) keyedList.put(key, new ArrayList<V>());
^
4 errors

List 和 List 不兼容的说法让我觉得好笑。有人能告诉我这里真正想要什么吗?

谢谢,杰罗姆。

最佳答案

您的代码中有几个问题:

  1. 如果您希望能够使用 Collections.sort(List)列表进行排序,集合的元素必须可比较
  2. 请勿在方法的定义中设置任何有界类型参数,否则编译器不会将其理解为与类定义中定义的类型相同的类型,即使您使用 KV 在两个地方。

代码应该是:

public class JCollated<K extends Comparable<? super K>, V extends Comparable<? super V>> {
...

public List<JLabeled<K, V>> getAll() {
...
}

public void createKey(K key) {
...
}
}

响应更新:

在方法 testStuff() 中,您没有正确定义 JCollat​​ed 类型的对象,它应该是:

JCollated<String, JUser> myCollated = new JCollated<String, JUser>();

关于java - 我对 Collections.sort 和 Map 的 Java 泛型的使用无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39278830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com