2015-01-09 105 views
2

我已经实施气泡排序为了排序IntDoublePair。例如:气泡排序不排序 - IntDoublePair

[1 0.5] 
[1 0.8] 
[1 0.67] 

排序为:

[1 0.5] 
[1 0.67] 
[1 0.8] 

当我执行的代码,它给我的数据不会按排序顺序。我很困惑,我哪里错了。我需要一些帮助。

private ArrayList<IntDoubleTextPair> sortCollection(ArrayList<IntDoubleTextPair> collection) 
    { 
     for (int current = 0; current < collection.size(); current++) 
     { 
      for (int next = 1; next < collection.size(); next++) 
      { 
       if (collection.get(current).getFirst().get() >= collection.get(next).getFirst().get()) 
       { 
        if (collection.get(current).getSecond().get() > collection.get(next).getSecond().get()) 
        { 
         temp = collection.get(next); 

         collection.set(next, collection.get(current)); 
         collection.set(current, temp); 
        } 
       } 
} 
} 
return collection; 
} 

回答

0

我想你可能有一些错误的逻辑:

if (collection.get(current).getFirst().get() >= collection.get(next).getFirst().get()) 
    { 
     if (collection.get(current).getSecond().get() > collection.get(next).getSecond().get()) 
     { 
      temp = collection.get(next); 
      collection.set(next, collection.get(current)); 
      collection.set(current, temp); 
     } 
    } 

与这两个嵌套的if语句,交换机将不会在这个例子中发生,但它需要:

[2 .1] 
[1 .9] 

,因为即使第一个if语句的结果为true,第二个if语句也会失败,因为它仅查找第二个数字。也许这会更好:

if (collection.get(current).getFirst().get() >= collection.get(next).getFirst().get()) 
    { 
     if (collection.get(current).getFirst().get() == collection.get(next).getFirst().get()) 
     { 
      if (collection.get(current).getSecond().get() > collection.get(next).getSecond().get()) 
      { 
      temp = collection.get(next); 

      collection.set(next, collection.get(current)); 
      collection.set(current, temp); 
      } 
     } 

     else 
     { 
      temp = collection.get(next); 

      collection.set(next, collection.get(current)); 
      collection.set(current, temp); 
     } 
    } 

快乐编码!如果您有任何问题,请留下评论。

+0

仍然没有正确排序。外部和内部循环初始化是否正确? – user1584253 2015-01-09 22:28:23

0

我认为这种排序应该至少对你传递的数组起作用(尽管嵌套的条件有问题),但是当你在交换操作中传递引用temp时可能会有问题,所以尝试创建一个临时对象,而不是通过参考传递值:

private ArrayList<IntDoubleTextPair> sortCollection(ArrayList<IntDoubleTextPair> collection) 
    { 
     for (int current = 0; current < collection.size(); current++) 
     { 
      for (int next = 1; next < collection.size(); next++) 
      { 
       if (collection.get(current).getFirst().get() >= collection.get(next).getFirst().get()) 
       { 

        if (collection.get(current).getSecond().get() > collection.get(next).getSecond().get()) 
        { 
         IntDoubleTextPair temp= new IntDoubleTextPair(); 
         temp.getFirst() = collection.get(next).getFirst(); 
         temp.getSecond() = collection.get(next).getSecond(); 

         collection.set(next, collection.get(current)); 
         collection.set(current, temp); 
        } 
        else if(collection.get(current).getFirst().get() != collection.get(next).getFirst().get()){ 
         IntDoubleTextPair temp= new IntDoubleTextPair(); 
         temp.getFirst() = collection.get(next).getFirst(); 
         temp.getSecond() = collection.get(next).getSecond(); 

         collection.set(next, collection.get(current)); 
         collection.set(current, temp); 

         } 
       } 
} 
} 
return collection; 
} 
+0

我已经重新初始化临时对象,如你所说,但没有运气 – user1584253 2015-01-12 10:27:02

+0

然后我认为,应该有一个与collection.set()方法有关的问题,你调试过,看到它正常工作吗?您可能需要重写该方法。或者,您可以按照您创建的相同方式更改当前对象和下一个对象的第一个和第二个值: – DoanCan 2015-01-12 14:44:39

+0

它应该可以使用浅拷贝进行交换,是的?我认为完全不需要为temp创建一个新的IntDoubleTextPair。但我可能会误解。 – Matt 2015-01-12 16:11:35