I want to order an ArrayList of strings by length, but not just in numeric order.
Say for example, the list contains these words:
cucumber
aeronomical
bacon
tea
telescopic
fantasmagorical
They need to be ordered by their difference in length to a special string, for example:
intelligent
So the final list would look like this (difference in brackets):
aeronomical (0)
telescopic (1)
fantasmagorical (3) - give priority to positive differences? doesn't really matter
cucumber (3)
bacon (6)
tea (8)
To sort the array by its string length, we can use the Array. sort() method by passing compare function as an argument. If the compare function return value is a. length - b.
In order to sort elements in an ArrayList in Java, we use the Collections. sort() method in Java. This method sorts the elements available in the particular list of the Collection class in ascending order. where list is an object on which sorting needs to be performed.
Use a custom comparator:
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; } }
Then sort the list using java.util.Collections.sort(List, Comparator)
.
If you are using java 8 you can also try using this lambda
packages.sort(Comparator.comparingInt(String::length));
If you're using Java 8+ you can use a lambda expression to implement (@Barend's answer as) the comparator
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()));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With