如果其中一个值相同,如何按字母顺序对数组列表排序(Java)
我有一个带有以下值的Arraylist:如果其中一个值相同,如何按字母顺序对数组列表排序(Java),java,arrays,sorting,arraylist,Java,Arrays,Sorting,Arraylist,我有一个带有以下值的Arraylist: was-2 it-2 -2 次数-2次 of-2 最佳-1 最差-1 这个列表刚刚按字符串末尾的计数值排序(使用选择排序),但现在我想按字母顺序对具有相同计数的单词进行排序,我不知道如何进行排序 因此,预期的输出应该是 [it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1] 概述 对于排序,始终有两种方法: 使类具有可比性 使用比较器 我假设你的值是类似于类的 public
was-2
it-2
-2
次数-2次
of-2
最佳-1
最差-1
这个列表刚刚按字符串末尾的计数值排序(使用选择排序),但现在我想按字母顺序对具有相同计数的单词进行排序,我不知道如何进行排序 因此,预期的输出应该是
[it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1]
概述
对于排序,始终有两种方法:
具有可比性
比较器
public class Entry {
private final String text;
private final int count;
// getters, constructor, toString, ...
}
可比较的 对于第一个选项,只需让类使用一个逻辑实现
compariable
,该逻辑首先使用计数
,然后,如果它相等,则考虑文本
public class Entry implements Comparable<? extends Entry> {
private final String text;
private final int count;
// getters, constructor, toString, ...
@Override
public int compareTo(Entry other) {
int countResult = -1 * Integer.compare(count, other.count);
return countResult != 0 ? countResult : text.compareTo(other.text);
}
}
-1*
是通过计数降序而不是默认的升序来获得排序
比较器 您可以使用
比较器执行同样的操作。幸运的是,自Java 8以来,我们获得了一些很好的帮助器方法,这使得这一过程更加简单,下面是代码:
Comparator<Entry> comparator = Comparator.comparingInt(Foo::getValue())
.reversed()
.thenComparing(Foo::getText());
拆分\s+-\s+
上的字符串,该字符串表示一个或多个空白字符(即\s+
),后跟-
,然后再后跟一个或多个空白字符
对数字(第二)部分的降序执行第一级比较,然后对第一部分的升序执行第二级比较
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String args[]) {
List<String> list = new ArrayList<>(
List.of("was - 2", "it - 2", "the - 2", "times - 2", "of - 2", "best - 1", "worst - 1"));
list.sort(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String[] s1Parts = s1.split("\\s+-\\s+");
String[] s2Parts = s2.split("\\s+-\\s+");
int i = Integer.compare(Integer.parseInt(s2Parts[1]), Integer.parseInt(s1Parts[1]));
if (i != 0) {
return i;
}
return s1Parts[0].compareTo(s2Parts[0]);
}
});
System.out.println(list);
}
}
注意:如果每个字符串的两部分总是用-
分隔,则可以拆分为s1。拆分(“-”代码>数组列表中的值是字符串吗?这是否回答了您的问题?您只需短接:Collections.sort(data);一些谷歌公司会考虑使用比较器吗。此链接可能会有所帮助如果您完成示例,则会有所帮助。请详细介绍答案。谢谢,此链接非常有用,但您能告诉我您对list.sort()和compare做了什么吗?那叫什么?所以我可以做更多的研究,非常欢迎你。我们在的compare
方法中编写排序逻辑。在这里,您可以编写如何比较两个给定对象。你可以从中学到更多。你也可以检查和确认。如有任何疑问,请随时发表评论。
Comparator<Entry> comparator = Comparator.comparingInt(Foo::getValue())
.reversed()
.thenComparing(Foo::getText());
entries.sort(comparator);
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String args[]) {
List<String> list = new ArrayList<>(
List.of("was - 2", "it - 2", "the - 2", "times - 2", "of - 2", "best - 1", "worst - 1"));
list.sort(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
String[] s1Parts = s1.split("\\s+-\\s+");
String[] s2Parts = s2.split("\\s+-\\s+");
int i = Integer.compare(Integer.parseInt(s2Parts[1]), Integer.parseInt(s1Parts[1]));
if (i != 0) {
return i;
}
return s1Parts[0].compareTo(s2Parts[0]);
}
});
System.out.println(list);
}
}
[it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1]