我正在研究一种使用合并排序对我的数组列表进行排序的方法。我的问题是它不会按照我想要的方式对数组列表进行排序(根据单词出现的总次数)。好像它正在对它进行排序,但是当我调试它时,它最终会恢复为字母顺序。
编辑:澄清:变量“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???");
}
}
答案 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)