【问题标题】:Merge Sort on an ArrayList对 ArrayList 进行合并排序
【发布时间】:2014-09-30 20:48:56
【问题描述】:

我正在研究一种使用归并排序对数组列表进行排序的方法。我的问题是它不会按照我想要的方式对数组列表进行排序(按单词出现的总次数)。似乎它正在对其进行排序,但是当我调试它时,它会在最后恢复为字母顺序。

编辑:澄清一下:变量“temp”是一个实例变量。这是我们要排序的 ArrayList。

代码:

public void mergeSortFreq(ArrayList<Term> toDo, int first, int mid, int last) {
    int first1 = first;
    int last1 = mid;
    int first2 = mid + 1;
    int last2 = last;
    int index = first1;
    ArrayList<Term> temp = new ArrayList<Term>();
    int counter = 0;
    while ((first1 <= last1) && (first2 < last2)) {
        if (toDo.get(first1).compareTo(toDo.get(first2).getTotalFrequency()) <= 0) {
            temp.add(toDo.get(first1));
            first1++;
            counter++;
        } else {
            temp.add(toDo.get(first2));
            first2++;
        }
        index++;
    }

    while (first1 < last1) {
        temp.add(toDo.get(first1));
        first1++;
        index++;
    }

    while (first2 < last2) {
        temp.add(toDo.get(first2));
        first2++;
        index++;
    }

    for(index = first; index < temp.size(); ++index){
            terms.set(index, temp.get(index));
    }
}

public void mergeFreqhelp(ArrayList<Term> toDo, int first, int last) {
    int mid = (first + last) / 2;
    if (first < last) {
        mergeFreqhelp(toDo, first, mid);
        mergeFreqhelp(toDo, mid + 1, last);
        mergeSortFreq(toDo, first, mid, last);
    }
    else{
        System.out.println("Working???");
    }
}

【问题讨论】:

标签: java sorting arraylist camera


【解决方案1】:

这是一个范围问题。您没有返回并分配来自mergeSortFreq 的排序结果。更改该方法,使其返回一个 ArrayList。否则排序将在方法内进行,但永远不会返回。

【讨论】:

  • 参数toDo 是对对象的引用。更改其内容也应该在方法之外可用,对吧?
  • toDo 是一个引用对象。但是temp(也就是排序结果)只存在于mergeSortFreq的范围内。
【解决方案2】:

当前发布的方法 mergeSortFreq(...) 的代码不完整。变量terms 不存在,一旦函数返回,参数toDo 保持不变。

您可以考虑在返回之前将内容从temp 转移到toDo

  • 我会将此添加为评论,但我还没有权限。

【讨论】:

    【解决方案3】:

    您提到temp 是一个实例变量 - 这就是您期望排序的结果?

    但是,在您的 mergeSortFreq 方法中,您有一行:

    ArrayList<Term> temp = new ArrayList<Term>();
    

    这将创建一个局部范围的变量,它将隐藏任何实例变量 - 因此您对 temp 所做的所有修改都只是对局部范围的列表进行 - 而不是实例变量,因此一旦您完成该方法就会丢失。

    只需更改 mergeFreqSort 中的行,使其仅重置实例变量:

    temp = new ArrayList<Term>();
    

    (如果您想考虑更简洁的递归实现,可以查看this version

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2013-04-23
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多