当前位置: 首页 > 知识库问答 >
问题:

实现一个比较器,根据整数包含的5位数对整数列表进行排序

蒋胡非
2023-03-14

我有一个整数列表,需要根据它们包含的数字5的数量进行排序。我必须为它实现比较器接口。

注意(大小写):如果两个数字具有相同的“5”数字,或者它们不包含“5”,则它们应按升序排列。

示例:525155555,155555

输出:1515552555555

解释:

15有一个'5'数字

155有两个'5'数字

525有两个'5'数字

555有三个数字

5555有四个'5'数字。

应根据这一点对其进行分类。

注意:525和155都有相同数量的“5”位数,因此它们是升序。

我的代码部分正常工作,它无法对具有相同“5”位数字的数字进行排序。

import java.util.*;

public class ClassComparable {
    public static void main(String[] args) {
        Integer arr[] = {155,85555,15, 405, 555, 510, 20, 150, 50, 85, 5505, 555, 959};
        List<Integer> list = Arrays.asList(arr);
        System.out.println("before ="+list);

        list.sort(new ClassComparable().new NumberOfFivesComparator());
        System.out.println("after="+list);

    }

    class NumberOfFivesComparator implements Comparator<Integer> {

        @Override
        public int compare(Integer t2, Integer t1) {
            int countInT1 = 0;
            int countInT2 = 0;

            while (t2 != 0) {

                if (t2 % 10 == 5) {
                    countInT2++;
                }
                t2 = t2 / 10;
            }
            while (t1 != 0) {
                if (t1 % 10 == 5) {
                    countInT1++;
                }
                t1= t1 / 10;
            }

            if(countInT1<countInT2) return 1;
           if (countInT1>countInT2) return -1;
           
           //if same number of '5's or no '5's are there then they must have ascending order, //help!!!!!!!!!!!!
            if(t1<t2) return 1;
            if (t1>t2) return -1;
            return 0;
        }
    }
}

输出

before=[15585555,1540555555102050150,8555055959]

后=[20, 15, 405, 510, 150, 50, 85, 959, 155, 555, 5505, 555,85555]

预期输出=[20,15,50,8515040551095915555550585555]

共有3个答案

梁俊友
2023-03-14

我让它只是计算字符,到目前为止工作正常:

public static void main(String[] args) {
    Integer arr[] = {155,85555,15, 405, 555, 510, 20, 150, 50, 85, 5505, 555, 959};
    List<Integer> list = Arrays.asList(arr);
    System.out.println("before ="+list);

    list.sort((o1, o2) -> {
        long c1 = getCounted5sOfInteger(o1);
        long c2 = getCounted5sOfInteger(o2);
        if (c1 != c2) {
            return Long.compare(c1, c2);
        } else {
            return Long.compare(o1, o2);
        }
    });
    System.out.println("after="+list);
}

private static long getCounted5sOfInteger(int i) {
    return String.valueOf(i).chars().filter(c -> c == '5').count();
}

输出:

before =[155, 85555, 15, 405, 555, 510, 20, 150, 50, 85, 5505, 555, 959]

after=[20, 15, 50, 85, 150, 405, 510, 959, 155, 555, 555, 5505, 85555]
公孙国兴
2023-03-14

比较NumberOfFivesComparator中的整数值t1t2时。比较,由于之前的算法,这两个值都是0

while (t2 != 0) {
    if (t2 % 10 == 5) {
        countInT2++;
    }
    t2 = t2 / 10;
}

此循环仅在t2=0时退出,因此在两个循环完成后,t1t2都将0,因此不会影响以下排序。换言之,对于任何两个编号相同的5s的数字,该方法返回0

要解决此问题,请按照f1sh的建议,使用不同的方法来计算5s的数量,或者使用算法的临时变量

for (int t2temp = t2; t2temp != 0;) {
    if (t2temp % 10 == 5) {
        countInT2++;
    }
    t2temp = t2temp / 10;
}
凌通
2023-03-14

你数错5了。

如果你把这个数字当作一个String,然后像这样数5:

class Scratch {
    public static void main(String[] args) {
        Integer arr[] = {155,85555,15, 405, 555, 510, 20, 150, 50, 85, 5505, 555, 959};
        List<Integer> list = Arrays.asList(arr);
        System.out.println("before ="+list);
        list.sort(Scratch::compare);
        System.out.println("after="+list);
    }
    public static int compare(Integer t2, Integer t1) {
        long countInT1 = t1.toString().chars().filter(c -> c=='5').count();
        long countInT2 = t2.toString().chars().filter(c -> c=='5').count();
        if(countInT1<countInT2) return 1;
        if(countInT1>countInT2) return -1;
        if(t1<t2) return 1;
        if(t1>t2) return -1;
        return 0;
    }
}

它打印

before =[155, 85555, 15, 405, 555, 510, 20, 150, 50, 85, 5505, 555, 959]
after=[20, 15, 50, 85, 150, 405, 510, 959, 155, 555, 555, 5505, 85555]
 类似资料:
  • 在引入比较器之前,输出是: 此代码生成的输出为: 我希望它产生的输出是: 编辑:为澄清而编辑。数组已更改,并在添加比较器之前输出。

  • 问题内容: 我想对整数的arraylist的arraylist进行排序,需要帮助吗? 我被告知,我需要实现比较器或可比对象,然后使用collection.sort对列表列表进行排序… 问题答案: 没有错误检查空列表,但是这里是。 使用Java 8,它变得更加简洁:

  • 嗨,我需要打印我的最高工资的人的方法。我有女巫雇员和女巫学生名单。当学生的平均成绩在4.5分以上时,他可以得到500英镑的薪水。 我有这样方法: 这是Person类: 这是学生课堂: 我需要的方法为最好的支付的人和方法总和所有人的收入。

  • 问题内容: 我需要使用自定义比较器对整数数组进行排序,但是Java的库没有为带有比较器的整数提供排序功能(比较器只能与对象一起使用)。有没有简单的方法可以做到这一点? 问题答案: 如果你无法更改输入数组的类型,则将执行以下操作: 这可以使用ArrayUtilscommons-lang项目轻松地在和之间进行转换,创建数组的副本,进行排序,然后将排序后的数据复制到原始数据上。

  • 我正在用下面的代码比较两个整数对象....为什么输出是“Both Integer are not equal...”虽然我在某处读到过,Integer或int将只在-128到127的范围内相等。为什么不是128?

  • 我一直在做拼字游戏作业。我需要从列表中读取单词,然后读取每个字符并赋值,最终为每个单词分配一个总分。已经完成了!唷。现在我需要使用比较器将单词从最高分到最低分进行排序。读了很多,还是很迷茫。我知道我可以使用接口,但也有使用lambda表达式的比较器,这是我想去的方向。我只是不知道该怎么做。我需要比较每个单词的sumValue,然后按降序打印单词。 我创建了 2 个循环来读取单词 (i),然后是字符