用于排序字符串[]

时间:2018-03-08 19:33:19

标签: java arrays algorithm sorting insertion-sort

我有一个关于使用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个字符,我试图删除硬编码支票的需要。

3 个答案:

答案 0 :(得分:2)

尝试使用String.CompareTo(String s)方法。它与您一直使用的比较运算符非常相似,除了它将计算为整数。

String str1 = "Cat";
String str2 = "Dog"; 

int sCompare = str1.CompareTo(str2);
  1. 如果sCompare == 0,则字符串是“相同”
  2. if sCompare&gt; 0,然后str1> str2(按字母顺序排列)
  3. 如果sCompare&lt; 0,然后str2> str1(按字母顺序排列)
  4. 编辑:

    为清楚起见,在上述示例的情况下,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库中的compareTocompareToIgnoreCase方法。要使这项工作只是更改 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"});
    }
}