首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序中值比较的问题

排序中值比较的问题
EN

Stack Overflow用户
提问于 2013-05-01 05:39:42
回答 4查看 47关注 0票数 0

我在一个单独的.java文件中使用ArrayList类方法等,同时我还在继续开发一个高分特性。现在,让两个相等的分数排列,这样第一个分数n (如果它是第一个分数,那么在它之前没有等于)在列表中的位置比第二个分数n高,这符合我的目的。我已经使用了两个排序方法,但是它总是跳过循环中我试图使用==比较的任何部分。我手动设置这些值作为“测试”(参见代码)。下面是代码,如果其中有任何看起来很难理解的地方,请随意提及。调试的东西被注释掉了。

代码语言:javascript
复制
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));
    }

请注意,据我所知,前两种排序的效果与预期一致。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-01 05:41:50

在java中,Integer是一个类。要比较两个对象的值,您需要使用.equals,否则您将比较它们是否是相同的对象(这意味着内存中的相同引用)。

票数 1
EN

Stack Overflow用户

发布于 2013-05-01 05:45:29

如上所述,将这些类与.equals()函数进行比较,并且您的测试变量显然不是原语类型...

票数 0
EN

Stack Overflow用户

发布于 2013-05-01 06:02:50

equals的默认实现是对一致性而不是相等性进行测试(实际上,“对象的相等性是由什么构成的?”这个问题的答案?可以成为一个相当复杂的讨论),即objecta.equals(对象B)在缺省情况下被定义为对象A ==对象B,这仅当它们引用完全相同的实例时才为真。

字符串可以与sa.equals(sb)进行开箱即用的比较,这是因为已经提供了一个equals()的实现,它在字符序列相同时建立相等。从来没有为您滚动的类提供equals()的实现。

这意味着,当您决定在集合框架中使用自己的对象,然后使用依赖于equals()实现的特性或方法时,就会遇到问题,因为a==b几乎从来都不是您想要的。

为了充分利用集合框架和您自己的对象,您必须定义和实现equals()、hashcode(),通常还有可比较的接口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16309408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档