簡體   English   中英

按長度對字符串的 ArrayList 進行排序

[英]Sort ArrayList of strings by length

我想按長度排序字符串的 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)

使用自定義比較器:

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)對列表進行排序。

如果您使用的是 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 你也可以嘗試使用這個 lambda

packages.sort(Comparator.comparingInt(String::length));
  • 按升序排列的字符串
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);
    }

}

您可以使用帶有顯式ComparatorCollections.sort()版本來執行此操作。

使用自定義比較器是正確的。 這是實現它的一種方法:

    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;

我有一個由 lambda 表達式解決的類似問題:

listBeforeSorting.sort((s1, s2) -> s1.length() - s2.length());

這樣,我們將得到按長度排序(升序)的列表。

Collections.sort(list, (a, b)->Integer.compare(a.length(), b.length()));

簡單的 Java8 解決方案,只有比較器和方法參考:Stream.of(list).flatMap(Collection::stream).sorted(Comparator.comparing(String::length)).collect(toList());

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);
    }
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();
       }
});

如果您使用的是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)

我認為提議的解決方案是非法的。

Comparator接口契約要求比較方法與equals方法一致。

這意味着如果你有x.compareTo(y) == 0那么你必須有x.equals(y) == true

因此,也許這些解決方案在實踐中有效,但它們無法保證,並且可能會在下一個版本中破解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM