你会如何编写一个方法,它接受2个String数组并按照每个元素的长度对数组中的元素进行排序?

时间:2012-03-18 07:06:33

标签: java

如何使用mergeSort编写一个方法,该方法接受2个字符串数组,并按照数组中每个元素的长度按顺序将它们合并为一个数组。并使用compareToIgnoreCase?

这是我到目前为止的代码。我甚至不知道我到目前为止是否正确行事;我只是想让我的合并排序工作。

public static String[] merge(String[] arr1, String[] arr2) {
    String index1 = "";
    String index2 = "";
    String[] result = new String[arr1.length + arr2.length];

    while (index1 < arr1.length && index2 < arr2.length) {
        if (arr1[index1] < arr2[index2]) {
            result[index1 + index2] = arr1[index1];
            index1++;
        } else {
            result[index1 + index2] = arr2[index2];
            index2++;               
        }
    }

    if (index1 == arr1.length){
        for (String i = index2; i < arr2.length; i++) {
            result[index1 + i] = arr2[i];
        }
    } else if (index2 == arr2.length){
        for (String i = index1; i < arr1.length; i++) {
            result[index2 + i] = arr1[i];
        }
    }

    return result;
}

4 个答案:

答案 0 :(得分:1)

这是一个真正的文字代码片段,可以回答您的问题。它使用合并排序算法将两个字符串数组(必须首先单独排序)组合成一个排序数组。比较基于长度优先(较大条目之前的较小条目),然后使用compareToIgnoreCase完成。

import java.util.Arrays;
import java.util.Comparator;

public class Test {

    // How would you write a method that takes 2 string arrays and merges them
    // into one array in order by the length of each element in the array by
    // using mergeSort. And by using compareToIgnoreCase?

    private static Comparator<String> COMP = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if(o1.length() < o2.length()) {
                return -1;
            }
            if(o1.length() > o2.length()) {
                return 1;
            }
            return o1.compareToIgnoreCase(o2);
        }
    };

    public static String[] mergeUnsorted(String[] arr1, String[] arr2) {
        arr1 = sort(arr1);
        arr2 = sort(arr2);

        return merge(arr1, arr2);
    }

    private static String[] sort(String[] arr) {
        if(arr.length <= 1)
            return arr;

        String[] left = Arrays.copyOfRange(arr, 0, arr.length/2);
        String[] right = Arrays.copyOfRange(arr, arr.length/2, arr.length);

        left = sort(left);
        right = sort(right);

        String[] combined = merge(left, right);

        return combined;
    }

    private static String[] merge(String[] arr1, String[] arr2) {
        String[] combined = new String[arr1.length + arr2.length];

        int a = 0, b = 0, i = 0;

        while(a < arr1.length || b < arr2.length) {
            int compare = 0;
            if(a >= arr1.length) {
                compare = 1;
            } else if(b >= arr2.length) {
                compare = -1;
            } else {
                compare = COMP.compare(arr1[a], arr2[b]);
            }

            if(compare < 0) {
                combined[i] = arr1[a];
                i++;
                a++;
            } else if(compare > 0) {
                combined[i] = arr2[b];
                i++;
                b++;
            } else {
                combined[i] = arr1[a];
                i++;
                a++;
                combined[i] = arr2[b];
                i++;
                b++;
            }
        }

        return combined;
    }

    public static void main(String[] args) {
        String[] arr1 = new String[] { "abc", "a", "A", "bA", "Ba" };
        String[] arr2 = new String[] { "def", "d", "D", "fG", "Fg", "abcde", "B" };

        System.out.println(Arrays.toString(mergeUnsorted(arr1, arr2)));
    }
}

答案 1 :(得分:0)

如果要排序,则应使用ArrayList。 ArrayList为String提供排序方法。无需实施自定义排序。

此外,如果您想对自己的对象进行排序,Collection提供了使用Comparable和Comparator对它们进行排序的工具。

 List<String> ls1=new ArrayList<String>();
    List<String> ls2=new ArrayList<String>();
    ls1.addAll(ls2);
    Collections.sort(ls1);

答案 2 :(得分:0)

您的代码存在一些问题。首先,index1index2应为int值,而不是String值。其次,您无法使用<比较字符串;使用String.compareTo()String.compareToIgnoreCase()。如果要比较字符串长度,请使用if (arr1[index1].length() < arr2[index2].length()) { ...

之类的内容

否则,我认为你走在正确的轨道上。

答案 3 :(得分:0)

您可以使用以下步骤:

  1. Apache Commons Lang3ArrayUtile合并两个数组(或更多数组)。
  2. 定义用于实现忽略大小写的自定义Comparatore接口。
  3. Arrays utilitin java.util排序合并数组。
  4. 我将此代码编写为实用方法:

    public void sort(String[] one, String[] two)
    {
        String[] merged_array = ArrayUtils.addAll(one, two);
    
        Comparator<String> ignorCase_comparatore = new Comparator<String>()
        {
            @Override
            public int compare(String o1,
                               String o2)
            {
                return o1.compareToIgnoreCase(o2);
            }
        };
    
        Arrays.sort(merged_array, ignorCase_comparatore);
    }
    

    我希望我的回答对你有用。