使用InsertionSort算法对其中包含空元素的字符串数组进行排序

时间:2016-10-23 01:01:28

标签: java arrays algorithm sorting

此处制定的算法具有O(n ^ 2)(插入排序)的复杂度。算法得到NullPointerException,因为null数组中有String个元素。如何让我的算法使用null元素对数组进行排序?算法如下:

private void sortFlowers(String flowerPack[]) {
    // TODO: Sort the flowers in the pack (No need to display
    // them here) - Use Selection or Insertion sorts
    // NOTE: Special care is needed when dealing with strings!
    // research the compareTo() method with strings

    String key;

    for (int j = 1; j < flowerPack.length; j++) { //the condition has changed
        key = flowerPack[j];
        int i = j - 1;

        while (i >= 0) {
            if (key.compareTo(flowerPack[i]) > 0) { //here too
                break;
            }

            flowerPack[i + 1] = flowerPack[i];

            i--;
        }

        flowerPack[i + 1] = key;
    }
}

2 个答案:

答案 0 :(得分:3)

如果key可以为null,那么您应该更改此条件:

key.compareTo(flowerPack[i]) > 0

类似于:

compareKeys(key, flowerPack[i]) > 0

然后添加null - 安全检查,例如:

private int compareKeys(final String first, final String second) {
    if (first == null || second == null) {
        return 0; // TODO: 0, here?
    } else {
        return first.compareTo(second);
    }
}

答案 1 :(得分:1)

compareTo()Comparable界面的一部分。它没有用于将null与任何东西进行比较的已定义行为。它实际上不能具有该行为,因为a.compareTo(b)b.compareTo(a)需要保持一致。你可以:

1)实现知道如何比较空值的自定义Comparator,然后将key.compareTo(flowerPack[i])替换为myComparator.compare(key, flowerPack[i])

2)Not use nulls

3)因为这看起来像是家庭作业,所以如果 {em} whilecompareTo(),请将key外观中的位重写为仅使用flowerPace[i]是非空的。如果其中任何一个(或两个)都为空,则需要特殊情况。