我有一个整数列表,需要根据它们包含的数字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]
我让它只是计算字符,到目前为止工作正常:
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]
比较NumberOfFivesComparator中的整数值
,由于之前的算法,这两个值都是t1
和t2
时。比较0
。
while (t2 != 0) {
if (t2 % 10 == 5) {
countInT2++;
}
t2 = t2 / 10;
}
此循环仅在t2=0
时退出,因此在两个循环完成后,t1
和t2
都将0
,因此不会影响以下排序。换言之,对于任何两个编号相同的5
s的数字,该方法返回0
。
要解决此问题,请按照f1sh的建议,使用不同的方法来计算5
s的数量,或者使用算法的临时变量。
for (int t2temp = t2; t2temp != 0;) {
if (t2temp % 10 == 5) {
countInT2++;
}
t2temp = t2temp / 10;
}
你数错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),然后是字符