我试图从驱动程序类传递一个Integer对象作为我创建的SortedArray Generic类的函数的参数时遇到问题.从我的驱动程序类,我将用户的int输入转换为Integer对象,以转换为我的SortedArray类的Comparable.
我继续收到错误:"线程中的异常"主"java.lang.ClassCastException:java.lang.Integer无法强制转换为Comparable".我查看了一些同学的源代码,但发现参数/参数设置没什么差别,但是他们的代码工作得很好.我一直在寻找几个小时试图找到我所犯的错误,但我仍然无法找到为什么我的Integer对象无法转换为Comparable.
这里有一点来自我的SortedArray类
public class SortedArray implements Comparable{
public int size;
public int increment;
public int top;
Comparable[] a = new Comparable [size];
public SortedArray(int initialSize, int incrementAmount)
{
top = -1;
size = initialSize;
increment = incrementAmount;
}
public int appropriatePosition(Comparable value)
{
int hold = 0;
if(top == -1)
{
return 0;
}
else
{
for(int i = 0; i <= top; i++)
{
if(a[i].compareTo(value) > 0)
{
hold = i;
break;
}
}
}
return hold; …Run Code Online (Sandbox Code Playgroud) 据我所知,事情如SortedMap或SortedSet使用compareTo(而不是equals上)Comparable<?>类型检查平等(contains,containsKey).
但是,如果某些类型在概念上是等同的,但不具有可比性呢?
(哈希码,内存地址,......)
我必须声明一个Comparator<?>并覆盖该方法int compareTo(T o1, To2).好的,我可以为被认为相等的实例返回0.但是,对于非实际情况,当订单不明显时我会返回什么?
使用SortedMap或SortedSet的方法是否相等,但(概念上)不可比的类型好吗?
谢谢!
编辑:
我不想存储已排序的东西,但我会使用"通常"的Map和Set,我无法"覆盖"相等行为.
编辑2:
为什么我不能覆盖equals(...):
我需要改变外来类的相等行为.我无法编辑它.
编辑3:
想想.NET:它们具有IEquatable接口,可以在不触及可比行为的情况下改变相等行为.
编辑4:
我不能只compareTo返回0表示相等,1表示不相等的实例吗?什么是大问题?我进行了一些测试,似乎SortedMap/SortedSet在一对实例上调用compareTo一次.是的,订单没有意义,但为什么它应该是我的问题呢?我不需要订单.*我只需要改变平等行为.可悲的是,大多数人都无法理解这一点.
注意:现在证明为非平等实例返回1的概念是错误的.
编辑5:
改变外国阶级的平等行为是一个坏主意吗?当然?我不这么认为:为什么我允许改变使用外国类的比较行为Comparator?
编辑6:
感谢Mark Peters和waxwing将密钥类型包装在自定义类中的想法.这样,我可以覆盖equals和hashCode,从而改变相等行为.
在Java中,我如何使用泛型来创建一个max函数,该函数将两个相同类型的Comparable对象作为参数并返回较大的对象?
我试过了:
public static <T extends Comparable> T max(T obj1, T obj2)
{
return ( ((obj1).compareTo(obj2) >= 0) ? obj1 : obj2);
}
Run Code Online (Sandbox Code Playgroud)
(如果它们都相等,则返回obj1.)
该方法基于我在http://www.informit.com/articles/article.aspx?p=170176&seqNum=3上找到的代码.
但是,当我编译它时,我收到此警告(使用-Xlint:unchecked进行编译):warning:[unchecked] unchecked调用compareTo(T)作为原始类型java.lang.Comparable的成员
我只使用它的接口调用一个特定的类.问题是,类本身实现了Comparable,但因为我通过不同的接口引用该类,所以编译器不知道它实现了Comparable.我确信有一个简单的解决方案......但我现在想不到它.
给出两个集合:如何在Java中有效地比较它们?
Lists,对它们进行排序并进行比较.(Comparable)Sets并比较hashCode套装?背景:
需要进行许多比较集很小(通常每组<5个元素).
我有一个类,其static方法采用Comparable[]as参数.
我需要找到并调用该方法.我尝试了以下内容 java reflection
class X{
public static void sort(Comparable[] a){
System.out.println("sorting");
}
public static void read(String name){
System.out.println("name="+name);
}
}
...
public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
String[] a= new String[]{"E","X","A","M","P","L","E"};
Class xc = Class.forName("my.javacode.X");
Method m2 = xc.getMethod("read", java.lang.String.class);
m2.invoke(null, "jon");
Method m1 = xc.getMethod("sort", Comparable[].class);
System.out.println(m1);
m1.invoke(null, a);
}
..
Run Code Online (Sandbox Code Playgroud)
这产生了一个例外
name=jon
public static void my.javacode.X.sort(java.lang.Comparable[])
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments …Run Code Online (Sandbox Code Playgroud) 我有一个叫做Employee实现Comparable接口的类.
现在Employee我的列表中有5个对象,每个对象都有自己的salary属性.我想找到所有Employee具有最高工资的对象.
我可以使用单个对象
Employee employee = Collections.max(employeeList);
Run Code Online (Sandbox Code Playgroud)
但是这只返回一个Employee,而我正在尝试检索具有相同最大值的所有对象的数组或列表.我怎样才能做到这一点?
我试图弄清楚如何使用可比较的方式对ArrayList进行排序,我的代码如下所示:
public class playerComparsion{
public static void main(String[] args){
ArrayList<Object> list = new ArrayList<Object>();
Player p1 = new Players(1,92,Zlatan);
Player p2 = new Players(2,92,Hazard);
Player p3 = new Players(1,82,Klose);
list.add(p1);
list.add(p2);
list.add(p3);
}
}
class Players implements Comparable{
int position;
String name;
int rating;
public Players(int i, int j, String string) {
this.position=i;
this.rating=j;
this.name=string;
}
public void getRating() {
System.out.println(this.rating);
}
public void getPos() {
System.out.println(this.position);
}
public void getName() {
System.out.println(this.name);
}
@Override
public int compareTo(Object o) { …Run Code Online (Sandbox Code Playgroud) 我一直在寻找我的问题的答案.我发现了大量相似的主题,但我仍然不知道该怎么做.
我有一个类,我想在排序的ArrayList中存储对象.
例如,我创建了这个类:
public class Kwadrat implements Comparable<Kwadrat> {
private int a;
public Kwadrat(int a){
this.a = a;
}
public int get_size(){
return a*a;
}
public int compareTo(Kwadrat b){
if(b.get_size() > get_size()){
return -1;
}
if(b.get_size() < get_size()){
return 1;
}
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Sort班级:
public class Sort <T> {
ArrayList<T> arraylist;
public Sort(){
arraylist = new ArrayList<T>();
}
public void add(T element){
arraylist.add(element);
Collections.sort(arraylist);
}
}
Run Code Online (Sandbox Code Playgroud)
Collections.sort(arraylist);仍然告诉我"没有类型变量的实例T存在,所以T conforms to Comparable<? super T> …
该CharSequence接口在Java 11中获得了一个新的静态方法:compare。
此方法返回一个int:
如果两个CharSequence相等,则值为0;否则为0。如果第一个CharSequence在字典上小于第二个,则为负整数;如果第一个CharSequence在字典上大于第二个,则为正整数。
那声音就像compareTo中Comparable。但是Java团队显然选择不进行CharSequence扩展Comparable。为什么不?逻辑逃脱了我。
?它是什么CharSequence::compare,不会是一个合适的适合Comparable::compareTo?
comparable ×10
java ×10
collections ×3
generics ×2
charsequence ×1
comparator ×1
compare ×1
compareto ×1
equals ×1
interface ×1
list ×1
max ×1
reflection ×1
set ×1