我正在尝试对ArrayList中的整数进行排序,该部分正在运行,但我也在努力保持并行数组与正确的整数匹配。我也不能把它们变成一个分组的对象。所以,如果我有3个单词,包含3个数字(ArrayList中的数字和ArrayList中的单词(“Hello” - 2,“The” - 5,“For” - 1)。我希望For和1先来,然后你好,最后将是The和5.所以它会带有数字的字。我下面的代码正确地排序整数,但似乎这些单词是随机的。
void quickSort2 (ArrayList<Integer> list, int first, int last, ArrayList list2){
//Set first and last
int g = first, h = last;
int midIndex, dividingValue;
//middle values
midIndex = (first + last) / 2;
dividingValue = list.get(midIndex);
System.out.println("midIdex = "+midIndex + "first = "+first+"last = "+last);
//find if higher or lower
do{
while (list.get(g) < dividingValue) {
g++;
}
while (list.get(h) > dividingValue){
h--;
}
if (g <= h){
//Switch ints (Works)
int temp = list.get(g);
list.set(g,list.get(h));
list.set(h,temp);
g++;
h--;
//Switch Strings with the ints (Doesnt work)
ArrayList blah = new ArrayList();
blah.add(list2.get(g));
list2.set(g,list2.get(h));
list2.set(h,blah.get(0));
}
}
while (g<h);
//Back to the method
if(h>first) {
quickSort2(list, first, h, list2);
}
if(g<last) {
quickSort2(list, g, last, list2);
}
}
答案 0 :(得分:0)
也许你应该在增加g和h的值之前尝试切换字符串...你也不需要创建Arraylist blah - 只需像你为int那样得到字符串
像这样......我没有深入研究你的代码,但这很可能是一个错误......
//Switch ints (Works)
int temp = list.get(g);
list.set(g,list.get(h));
list.set(h,temp);
// *** Don't increment here ***
// *** Switch Strings with the ints first ***
String tempStr = list2.get(g);
list2.set(g,list2.get(h));
list2.set(h,tempStr );
// *** Now increment ***
g++;
h--;
答案 1 :(得分:0)
这是一个将整数键和String
组合在一起的简单类:
public class DataItem {
// These are the pieces of data each DataItem will carry around
private int key;
private String data;
// This is a constructor; if you say new DataItem(2,"Hello"), it creates an
// object whose key is 2 and data is "Hello"
public DataItem(int key, String data) {
this.key = key;
this.data = data;
}
// A method to get the object's key
public int getKey() {
return key;
}
// A method to get the object's data
public String getData() {
return data;
}
}
现在,您的quickSort2
方法将采用ArrayList<DataItem>
而不是ArrayList<Integer>
。当您在get
上使用ArrayList
方法时,它将返回整个DataItem
而不是Integer
。这意味着如果你想要整数,你需要调用getKey()
来获取它。而不是
dividingValue = list.get(midIndex);
你会说
dividingValue = list.get(midIndex).getKey();
而不是
while (list.get(g) < dividingValue) {
它将是
while (list.get(g).getKey() < dividingValue) {
但好消息是,当您切换项目时,它会切换整个DataItem
,这意味着String
将保留整数,这就是您想要的。因此,在“切换整理”评论下,将temp
的类型从int
更改为DataItem
。然后你的交换将交换所有东西。
(为了做得更好,您可以DataItem
实施Comparable<DataItem>
,方法是添加compareTo
方法,通过比较DataItem
将key
与另一个DataItem
进行比较{1}}字段。然后您可以在{{1}}的数组上使用内置排序和其他方法。我会让您自己阅读此tutorial。)