我正在使用ArrayList类方法,并且在单独的.java文件中,因为我继续处理高分数功能。现在,根据我的目的,安排两个相等的分数,使得得分n的第一个实例(如果它是第一个得分,则不等于它之前)在列表上比第二个得分n更高。我已经使用了两种排序方法,但它总是跳过循环的任何部分,我尝试使用==比较。我手动设置值为“测试”(参见代码)。代码如下,如果其中任何一个似乎很难理解,请随意提及它。调试的东西被注释掉了。
import java.util.*;
public class arraylisttest
{
public static void main(String[] args)
{
ArrayList<Integer> grn = new ArrayList<Integer>();
System.out.println("Empty:");
for (int i = 0; i < grn.size(); i++)
{
System.out.println("Key" + i + " : " + grn.get(i));
}
grn.add(122);
grn.add(534);
grn.add(132);
grn.add(310);
grn.add(267);
grn.add(322);
System.out.println("Full:");
for (int i = 0; i < grn.size(); i++)
{
System.out.println("Key" + i + " : " + grn.get(i));
}
int myscore = 534;
Integer test = myscore;//reassignment, not entirely necessary
int y = 0;
Collections.sort(grn);
System.out.println("Sorted: ");
for (int i = 0; i < grn.size(); i++)
{
System.out.println("Key" + i + " : " + grn.get(i));
}
//fix sort so that number is added correctly if equal to last element
int max = grn.size();
if(test > grn.get(y))
{
if(test < grn.get(max - 1))
{
System.out.println("bigger, sm max");
grn.set(y, test);//in at 0
y++;//now 1
while (grn.get(y) < test)
{
grn.set(y-1, grn.get(y));//shift this one down
grn.set(y, test);//fill the hole
y++;//ends up at 5
}
}
else if(test > grn.get(max-1))
{
System.out.println("bigger, gr max");
int temp = grn.get(max-1);
grn.set(max-1, test);//in at end
y++;
while(y < (max-1))
{
grn.set(y-1, grn.get(y));//shift this one down
grn.set(y, grn.get(y+1));//fill the hole
y++;//ends up at 5
}
grn.set(max-2, temp);
}
else if(test == grn.get(max-1))//error here
{
System.out.println("bigger, eq max");
y++;//now 1
while (grn.get(y) < test)
{
grn.set(y-1, grn.get(y));
grn.set(y, test);
y++;
}
grn.set(y-1, test);
}
else
{
System.out.println("Oops.");
}
}
else
{
System.out.println("too small");
}
//end sort
//System.out.println("Test: " + test);
//System.out.println("Myscore: " +myscore);
System.out.println("Sort" + y + " : ");
for (int i = 0; i < grn.size(); i++)
{
System.out.println("Key" + i + " : " + grn.get(i));
}
请注意,就我所知,前两种排序按预期工作。
答案 0 :(得分:1)
在java Integer
中是一个类。要比较两个对象的值,你需要使用.equals
,否则你要比较它们是否是同一个对象(这意味着内存中的引用相同)。
答案 1 :(得分:0)
如上所述,这些类与.equals()函数进行比较,你的测试变量显然不是原始类型...
答案 2 :(得分:0)
对于身份而不是为了相等的equals测试的默认实现(实际上,对于“对象的什么构成对象?”的问题的答案可以变成一个相当复杂的讨论),即objecta.equals(objectb)被定义默认情况下为objecta == objectb,仅当这些引用完全相同的实例时才为真。
使用sa.equals(sb)开箱即可比较字符串的原因是因为提供了equals()的实现,在字符序列相同时建立相等性。永远不会为您滚动的类提供equals()的实现。
这意味着当您决定在Collections框架中使用自己的对象,然后使用依赖于equals()实现的特性或方法时,会遇到问题,因为== b几乎不会是什么你想要的。
TL; DR:要使用您自己的对象充分利用Collections Framework,您必须定义并实现equals(),hashcode()以及Comparable接口。
答案 3 :(得分:0)
我认为您尝试手动排序的原因是,您希望确保先获得分数的人在遇到平局时首先列出。有一种更好的方法 - 将数据存储在自定义对象中,并将Collections.sort()
与比较器一起使用。
例如:
public class HighScore {
public int score
public String name
public long timestamp
public HighScore(int score, String name, long timestamp) {
this.score = score;
this.name = name;
this.timestamp = timestamp;
}
}
创建时,使用System.currentTimeMillis()
获取时间戳。然后在对它们进行排序时,请使用:
Collections.sort(grn, new Comparator<HighScore>() {
@Override
public int compare(Highscore h1, Highscore h2) {
if (h1.score == h2.score) {
return h1.timestamp < h2.timestamp ? -1 : 1;
} else {
return h2.score - h1.score;
}
});
这样您只需要调用grn.add()
,然后调用Collections.sort()