合并在ArrayList上排序

时间:2014-09-30 20:48:56

标签: java sorting arraylist camera

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

编辑:澄清:变量“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???");
    }
}

3 个答案:

答案 0 :(得分:0)

这是范围问题。您没有返回并从mergeSortFreq分配排序结果。更改该方法,以便返回ArrayList。否则,排序将在方法中进行,但永远不会返回。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

您提到temp是一个实例变量 - 这是您希望排序的内容吗?

但是,在mergeSortFreq方法中,您有以下行:

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

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

只需更改mergeFreqSort中的行,这样就可以重置实例变量:

temp = new ArrayList<Term>();

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