我有一个关于使用Java中的插入排序算法对String []数组进行排序的问题。我确实意识到使用不同的算法可能更容易完成我的问题,但我试图先了解一下这一切是如何工作的。
基本上,我正在尝试使用该算法对字符串数组进行排序。为此,我比较字符串数组中的 char 值,以便我可以使用标准> 和 == 运算符,因为比较值这种方式(就像你使用整理一样)自然很简单。
我有一个解决方案,我正在通过每个数组索引找到的前两个char值对字符串数组进行排序,但我开始意识到我所做的并不是一个非常强大的解决方案,因为字符串在数组可以很容易地拥有更长的值。对于具有相似值的较长字符串,不会使我的排序非常准确。
考虑到这一点,有人可以建议(与我下面编写的代码一起)如何动态比较从各种字符串创建的 char 值来排序原始的字符串值?
因此...
答: ...我不会遇到NullPointer异常,比较不同大小字符串的值
B: ...无论大小如何,每个char值都会从字符串中进行比较,因此我可以准确地对原始字符串数组进行排序。
public String[] sortArrayOfStrings(String[] array){
//NOT COMPLETE, ONLY SORTS BASED ON FIRST & SECOND CHAR OF STRING INDEX
//BASED ON INSERTION SORT ALGORITHM
int length = array.length;
String value;
int index;
for(int a = 1; a < length; a++){
char currentCharValue = array[a].charAt(0);//USE '[a]' not '[index]'
value = array[a];
index = a;
if(currentCharValue == array[a - 1].charAt(0) ){//IF FIRST CHAR == PREVIOUS
while (index > 0 && array[index - 1].charAt(1) > array[index].charAt(1)){
array[index] = array[index - 1];
index = index - 1;
}
}else{
while (index > 0 && array[index - 1].charAt(0) > currentCharValue){
array[index] = array[index - 1];
index = index - 1;
}
}
array[index] = value;
}
return array;
}
由于2个char检查而按预期工作的示例数组:
String[] arr = {"zz", "bb", "cb", "ba","za", "zb", "cz", "ab","aa"};
由于额外的字符而无法正确排序的示例数组:
String[] arr = {"bbz", "bba", "abz","abc"};
我知道上面的数组无法正确排序,因为硬编码检查&#39; 2个字符,我试图删除硬编码支票的需要。
答案 0 :(得分:2)
尝试使用String.CompareTo(String s)方法。它与您一直使用的比较运算符非常相似,除了它将计算为整数。
String str1 = "Cat";
String str2 = "Dog";
int sCompare = str1.CompareTo(str2);
编辑:
为清楚起见,在上述示例的情况下,sCompare将评估为负值。
答案 1 :(得分:1)
如果你真的想用chars comparsion来做,最好的方法是创建单独的方法来比较这些字符串。
在isSmallerThan()内部循环增加 currentIndex ,直到它不会超出任何参数和,直到字符相同为止。 然后,如果语句检查currentIndex是否超出了至少一个字符串的范围,则可能会发生输入,例如: (aaaaa,aa), (aaabb,aaa), (aaa,aaa)。 然后我们必须通过长度比较来决定什么是较小的。
对于插入排序算法的情况,我们不关心(aaa,aaa)是相同的字符串,我们可以只返回这是假的,并且它会在sortArrayOfStrings方法中中断while循环。
另外我们知道字符不同,我们只是比较它们。
String[] sortArrayOfStrings(String[] array){
int length = array.length;
String value;
int index;
for(int a = 1; a < length; a++){
value = array[a];
index = a;
while(index > 0 && isSmallerThan(value, array[index-1])) {
array[index] = array[index - 1];
--index;
}
array[index] = value;
}
return array;
}
boolean isSmallerThan(String left, String right) {
int curIndex = 0;
while (curIndex < left.length()
&& curIndex < right.length()
&& left.charAt(curIndex) == right.charAt(curIndex)){
++curIndex;
}
if (curIndex == left.length() || curIndex == right.length())
return left.length() < right.length();
else
return left.charAt(curIndex) < right.charAt(curIndex);
}
但正如人们在我之前所说的那样,最好使用String库中的compareTo或compareToIgnoreCase方法。要使这项工作只是更改 isSmallerThan(value,array [index-1]) 的到强> array [index-1] .compareToIgnoreCase(value)&gt; 0
答案 2 :(得分:0)
使用compareTo()
方法,insertion sort
算法的实现可能如下所示:
class InsertionSorter {
public String[] sortArrayOfStrings(String[] array) {
for (int i = 1; i < array.length; i++) {
String element = array[i];
int j;
for (j = i - 1; j >= 0 && element.compareTo(array[j]) <= 0; j--)
array[j + 1] = array[j];
array[j + 1] = element;
}
return array;
}
}
示例测试:
public class InsertionSorterTest {
@Test
public void shouldSortTwoLetterWords() {
String[] arr = {"zz", "bb", "cb", "ba", "za", "zb", "cz", "ab", "aa"};
String[] sortedArray = new InsertionSorter().sortArrayOfStrings(arr);
Assert.assertEquals(sortedArray, new String[]{"aa", "ab", "ba", "bb", "cb", "cz", "za", "zb", "zz"});
}
@Test
public void shouldSortLongerWords() {
String[] arr = {"bbz", "bba", "abz", "abc"};
String[] sortedArray = new InsertionSorter().sortArrayOfStrings(arr);
Assert.assertEquals(sortedArray, new String[]{"abc", "abz", "bba", "bbz"});
}
}