有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用数组。sort可对字符串数组中的字谜进行排序

我想根据一组字谜对数组进行排序

例如:

[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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    结果:

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

    这可能接近于对isAnagram方法进行一些调优所需要的(我为这个测试编写了一个粗略的快速版本,我没有检查一个字符串是否完全包含在另一个较大的字符串中)