2014-01-06 21 views
-1

我想排序在ArrayList中的整数,该部分正在工作,但我也试图保持与正确的整数匹配的并行数组。我也无法将它们变成分组对象。所以,如果我有3个数字(ArrayList中的数字和ArrayList中的数字(“Hello” - 2,“ - 5,”For - 1)),我会让For和1先到达,然后您好,到最后将是和5所以它会延续与数量的单词。我有下面的代码是正确的排序整数,但似乎这样的词语被随机分配。ArrayList整数排序与字符串连接

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

“我不能让他们成为一个分组对象,”为什么?关键值对怎么样? – turbo

+0

通过“分组对象”,我假设你的意思是一些对象既有整数也有'String'。那么,为什么你不能分组对象?当您只想将其中一个作为关键字进行排序时,这是用多个数据分类项目的正常方式。 – ajb

回答

0

也许你应该请尝试关闭字符串你增加G和H的值之前......你也不必创建数组列表等等 - 刚刚得到的字符串像你这样的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--; 
+0

工作正常!谢谢!我一直认为,一旦你在一个如果,你留在。 –

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>的。当您在ArrayList上使用get方法时,将返回整个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将保持整数,这是你想要的。因此,在您的“Switch ints”评论中,将temp的类型从int更改为DataItem。然后你的交换将交换一切。

(为了使这更妙的是,你可以有DataItem实现Comparable<DataItem>,通过添加一个compareTo方法,将通过比较只是key领域比较一个DataItem到另一个地方。然后你可以使用内置的排序和阵列的其他方法我会让你自己读这个tutorial