簡體   English   中英

使用Array.sort對字符串數組中的字母進行排序

[英]Using Array.sort to sort anagrams in a String array

我想根據他們的字謎組對數組進行排序。

例如:

[anew, sale, wane, ales, ascent, seal, wean, leas, secant]

應該輸出:

[anew, wane, wean, ales, leas, sale, seal, ascent, secant]

或者,只要將它們組合在一起,它就可以按任何順序輸出字謎。

所以我嘗試這樣做:

Arrays.sort(array, (s1, s2) -> {
   if (s1.length < s2.length)
        return -1;
    else if (s1.length > s2.length)
        return 1;
    else
        return s1.compareTo(s2);
   });

但是我得到了:

[secant, leas, wean, seal, ascent, ales, wane, sale, anew]

我知道問題出在比較器中,但我無法弄清楚出了什么問題。

您的算法可能無法工作,因為排序是通過本地比較元素來實現的。 要按字謎數字排序,您需要記住哪些字符串是彼此的字謎。 這不是決定,可以通過比較兩個沒有上下文的元素來實現。 您需要先識別並收集字謎。 然后,您可以構造結果列表。

package sandbox;

import java.util.Arrays;
import java.util.List;

public class AnagramSort {
    private static final String[] DATA = { "anew", "sale", "wane", "ales", "ascent", "seal", "wean", "leas", "secant" };

    public static void main(String[] args) {
        List<String> data = Arrays.asList(DATA);

        System.out.println(data);
        data.sort(AnagramSort::isAnagram);
        System.out.println(data);
    }

    public static int isAnagram(String a, String b) {
        char[] s1 = a.toCharArray();
        char[] s2 = b.toCharArray();
        if (s1.length < s2.length)
            return -1;
        else if (s1.length > s2.length)
            return 1;

        Arrays.sort(s1);
        Arrays.sort(s2);
        return Arrays.compare(s1,s2);

    }
}

結果是:

[銷售,啤酒,海豹,利物,重新,衰弱,斷奶,上升,割線]

通過對isAnagram方法進行一些調整,這可能接近您所需要的(我為該測試編寫了一個粗略的快速版本,但我沒有檢查一個字符串是否完全包含在另一個更大的字符串中的一個字謎)。

暫無
暫無

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

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