ArrayList整数使用附加的字符串排序

时间:2014-01-06 21:04:31

标签: java string sorting arraylist int

我正在尝试对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);

    }
}

2 个答案:

答案 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方法,通过比较DataItemkey与另一个DataItem进行比较{1}}字段。然后您可以在{{1}}的数组上使用内置排序和其他方法。我会让您自己阅读此tutorial。)