按长度对字符串的 ArrayList 进行排序
Posted
技术标签:
【中文标题】按长度对字符串的 ArrayList 进行排序【英文标题】:Sort ArrayList of strings by length 【发布时间】:2011-11-26 09:46:29 【问题描述】:我想按长度排序字符串的 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)
【问题讨论】:
如仅链接答案中所述,这可以使用Collections.sort() 来完成,它需要一个明确的Comparator 【参考方案1】:如果您使用的是 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)
【讨论】:
【参考方案2】:Collections.sort(list, (a, b)->Integer.compare(a.length(), b.length()));
【讨论】:
【参考方案3】: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();
);
【讨论】:
【参考方案4】: 字符串升序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);
【讨论】:
【参考方案5】: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);
【讨论】:
【参考方案6】:我有一个通过 lambda 表达式解决的类似问题:
listBeforeSorting.sort((s1, s2) -> s1.length() - s2.length());
这样,我们将得到按长度(升序)排序的列表。
【讨论】:
【参考方案7】:简单的 Java8 解决方案,仅包含 Comparator 和 Method 参考: Stream.of(list).flatMap(Collection::stream).sorted(Comparator.comparing(String::length)).collect(toList());
【讨论】:
【参考方案8】:如果你使用的是 java 8,你也可以尝试使用这个 lambda
packages.sort(Comparator.comparingInt(String::length));
【讨论】:
【参考方案9】:使用自定义比较器是正确的。这是实现它的一种方法:
Comparator c = new Comparator<String>()
public int compare(String s1, String s2)
return Integer.compare(s1.length(), s2.length());
;
Collections.sort(results, c);
return results;
【讨论】:
【参考方案10】:如果您使用的是 Java 8+,则可以使用 lambda 表达式来实现(@Barend 的回答为)比较器
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()));
【讨论】:
Java 8+ 的最佳解决方案。简短而准确。 如果您只想按长度排序:strings.sort((s1, s2) -> s1.length() - s2.length());
【参考方案11】:
您可以使用带有显式Comparator 的Collections.sort() 版本来执行此操作。
【讨论】:
【参考方案12】:使用自定义比较器:
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)
对列表进行排序。
【讨论】:
正差异的优先级可以通过将正差异乘以 2,将负差异乘以负 2,然后加一来给出。 您应该将 referenceLength 设为最终值。以上是关于按长度对字符串的 ArrayList 进行排序的主要内容,如果未能解决你的问题,请参考以下文章