使用Array.sort对String数组中的anagrams进行排序

时间:2018-02-07 22:03:35

标签: java

我想根据他们的字谜组对数组进行排序。

例如:

[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]

我知道问题存在于比较器中,但我无法弄清楚出了什么问题。

2 个答案:

答案 0 :(得分:2)

您的算法无法工作,因为排序是通过本地比较元素来实现的。要按字母数量排序,你需要记住哪些字符串是彼此的字谜。这不是一个决定,这可以通过比较没有上下文的两个元素来实现。您需要先识别并收集字谜。然后你可以构造结果列表。

答案 1 :(得分:0)

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

    }
}

结果:

  

[销售,啤酒,海豹,leas,anew,wane,wean,ascent,割线]

这可能接近你需要对isAnagram方法做一些调整(我为这个测试编写了一个粗略的快速版本,我没有检查是一个字符串是一个完全包含在另一个更大的字符串中的字谜)。