如何使用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;
}
答案 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)
您的代码存在一些问题。首先,index1
和index2
应为int
值,而不是String
值。其次,您无法使用<
比较字符串;使用String.compareTo()
或String.compareToIgnoreCase()
。如果要比较字符串长度,请使用if (arr1[index1].length() < arr2[index2].length()) { ...
。
否则,我认为你走在正确的轨道上。
答案 3 :(得分:0)
您可以使用以下步骤:
ArrayUtile
合并两个数组(或更多数组)。Comparatore
接口。Arrays
utilitin java.util
排序合并数组。我将此代码编写为实用方法:
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);
}
我希望我的回答对你有用。