我想按长度订购字符串的ArrayList,但不只是按数字顺序排序。
比如说,列表中包含以下单词:
cucumber
aeronomical
bacon
tea
telescopic
fantasmagorical
他们需要根据长度与特殊字符串的顺序进行排序,例如:
intelligent
所以最终的列表看起来像这样(括号中的差异):
aeronomical (0)
telescopic (1)
fantasmagorical (3) - give priority to positive differences? doesn't really matter
cucumber (3)
bacon (6)
tea (8)
答案 0 :(得分:29)
使用自定义比较器:
public class MyComparator implements java.util.Comparator<String> {
private int referenceLength;
public MyComparator(String reference) {
super();
this.referenceLength = reference.length();
}
public int compare(String s1, String s2) {
int dist1 = Math.abs(s1.length() - referenceLength);
int dist2 = Math.abs(s2.length() - referenceLength);
return dist1 - dist2;
}
}
然后使用java.util.Collections.sort(List, Comparator)
对列表进行排序。
答案 1 :(得分:9)
如果您正在使用Java 8+,您可以使用lambda表达式来实现(@ Barend&#39;答案)比较器
List<String> strings = Arrays.asList(new String[] {"cucumber","aeronomical","bacon","tea","telescopic","fantasmagorical"});
strings.sort((s1, s2) -> Math.abs(s1.length() - "intelligent".length()) - Math.abs(s2.length() - "intelligent".length()));
答案 2 :(得分:5)
This will help you - String in Ascending order
class StringLengthListSort implements Comparator<String>{
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
/**
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
StringLengthListSort ss = new StringLengthListSort();
list.add("ram");
list.add("rahim");
list.add("ramshyam");
Collections.sort(list, ss);
System.out.println(list);
}
}
答案 3 :(得分:3)
您使用明确Collections.sort()的Comparator版本执行此操作。
答案 4 :(得分:1)
使用自定义比较器是正确的。这是实现它的一种方法:
var_dump($_FILES);
die();
答案 5 :(得分:1)
我有一个类似的问题,可以通过lambda表达式解决:
// a more secure version
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
char *var_str = argv[1];
char *text = NULL;
int base = 10; // default base
errno = 0; // intializing errno
long int variation = 0;
variation = strtol(var_str, &text, base);
// now on to error detection
// full error trace
if (var_str == text) {
printf ("error: no number found\n");
} else if (errno == ERANGE && variation == LONG_MIN) {
printf ("error: underflow\n");
} else if (errno == ERANGE && variation == LONG_MAX) {
printf ("error: overflow\n");
} else if (errno != 0 && variation == 0) {
printf ("error: unknown error\n");
} else if (errno == 0 && var_str && !*text) {
printf ("variation: %ld\n", variation);
} else if (errno == 0 && var_str && *text != 0) {
printf ("variation: %d, but some text included: %s\n", variation, text);
}
} else if (argc < 2) {
printf("no agrument provided.\n");
} else {
printf("only one argument was expected. %d provided.\n", argc);
}
return 0;
}
这样,我们将获得按长度排序(升序)的列表。
答案 6 :(得分:0)
如果您使用的是Java 8,也可以尝试使用此lambda
packages.sort(Comparator.comparingInt(String::length));
答案 7 :(得分:0)
简单的Java8解决方案,仅提供Comparator和Method参考: Stream.of(list).flatMap(Collection :: stream).sorted(Comparator.comparing(String :: length))。collect(toList());
答案 8 :(得分:0)
The shortest code for this-
public static void main(String... str) {
List.of("am", "I", "Best", "the").stream().sorted((a, b) -> a.length() - b.length())
.forEach(System.out::println);
}
答案 9 :(得分:0)
List<String> list = Arrays.asList("geeksforgeeks", "geeksfor", "geeks");
Collections.sort(list, new Comparator<String>(){
public int compare(String s1, String s2){
return s1.length() - s2.length();
}
});
答案 10 :(得分:0)
Collections.sort(list, (a, b)->Integer.compare(a.length(), b.length()));
答案 11 :(得分:0)
如果您使用的是 Kotlin,则可以使用此代码
var A = ArrayList<String>()
A.add("Alen")
A.add("Nymar")
A.add("Ronaldo")
A.add("Totianas")
A.add("Ted")
A.add("Sara")
Collections.sort(A, object : Comparator<String?> {
override fun compare(p0: String?, p1: String?): Int {
return (p1!!.length - p0!!.length)
}
})
System.out.println(A)
答案 12 :(得分:-1)
我认为提议的解决方案是非法的。
Comparator接口契约要求比较方法与equals方法一致。
这意味着如果您有x.compareTo(y) == 0
,那么您必须拥有x.equals(y) == true
。
所以,也许这些解决方案在实践中有效,但它们无法保证,并且可能会在下一个版本中破解。