合并对Java

时间:2016-02-02 00:00:37

标签: java arrays algorithm

我目前正在尝试在Java中实现基于“算法简介:第三版”中的合并排序算法。 作者使用分而治之的算法,该算法也实现了哨兵卡(here is pseudo code)。这些卡应该具有无穷大的值,但由于我使用的是字符串数组,因此我假设该值为null。显然情况并非如此,因为当我尝试比较L [i]和R [j]时,我得到一个空指针异常。这是我的代码:

public static void main(String[] args) {
    Scanner textfile = new Scanner(System.in);
    System.out.println("Enter a filename: ");
    String fileName = textfile.nextLine();
    String[] words = readArray(fileName);
    mergeSort(words, 0, words.length - 1);
    for (String word : words) {
        System.out.println(word);
    }

}

public static String[] readArray(String file) {
    int ctr = 0;
    try {
        Scanner s1 = new Scanner(new File(file));
        while (s1.hasNextLine()) {
            ctr = ctr + 1;
            s1.nextLine();
        }
        String[] words = new String[ctr];
        Scanner s2 = new Scanner(new File(file));
        for(int i = 0; i < ctr; i++) {
            words[i] = s2.next();
        }
        return words;
    }
    catch (FileNotFoundException e){
        System.out.println("File not found.");
    }
    return null;
}

public static void mergeSort(String[] A, int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        mergeSort(A, p, q);
        mergeSort(A, q + 1, r);
        merge(A, p, q, r);
    }
}

public static void merge(String[] A, int p, int q, int r) {
    int n1 = q - p + 1;
    int n2 = r - q;

    String[] left = new String[n1 + 1];
    String[] right = new String[n2 + 1];

    for (int i = 0; i < n1; i++) {
        left[i] = A[p + i];
    }

    for (int j = 0; j < n2; j++) {
        left[j] = A[q + j + 1];
    }
    left[n1] = null;
    right[n2] = null;
    for (int i = 0, j = 0, k = p; k < r; k++) {
        if (left[i].compareTo(right[j]) <= 0) { \\Null Pointer Exception
            A[k] = left[i];
            i++;

        } else {
            A[k] = right[j];
            j++;

        }
    }
}

那么问题是什么?是因为我将两个数组声明为null吗?我试过像“zzzz”这样的东西,但仍然遇到同样的问题。还是我完全错过了其他的东西? 此外,伪代码假定数组从索引1开始,这就是我的代码略有变化的原因。我在那里做错了吗?

1 个答案:

答案 0 :(得分:0)

你是无限的 - String必须满足以下属性:

s.compareTo(infinityString) == -1

任何 s,如果您想使用String#compareTo。据说infinityString = null不会产生必需的属性,因为如果代码NullPointerException a.compareTo(b)ab,则会生成infinityString String。只需使用足够长String个任意字符就会有真正丑陋的解决方法,因此输入中不存在同样长的String#compareTo。但是那个:

  • 非常丑陋且不安全黑客
  • 浪费记忆

相反,我建议使用以下两种方法之一:

  • 使用您自己的比较方法代替compare(s , infinityString) = -1,这会为您要定义infinityString的任何内容生成属性class BrowserChecker def initialize(browser) @browser = browser @version = browser.version.to_i end def browser_not_supported? !@browser.modern? || chrome_bad? || firefox_bad? || io_bad? end private def chrome_bad? @browser.chrome? && @version < AppConfig.requirements['browser_google'].to_i end def firefox_bad? @browser.firefox? && @version < AppConfig.requirements['browser_firefox'].to_i end def safari_bad? @browser.safari? && @version < AppConfig.requirements['browser_safari'].to_i end def ie_bad? @browser.ie? && @version < AppConfig.requirements['browser_msft'].to_i end end # called like this BrowserChecker.new(some_browser_object)
  • 使用不带标记卡的merge-sort实现,只需消除对无限元素的需求。
相关问题