2016-05-23 81 views
0

我想根据三个要求分类列表。该列表包含将使用以下三个组件的对象ROUTE:利润,总距离和一个名为apr的整数。如何根据三个要求对列表进行排序?

我想以这样一种方式添加对象,使列表从开始处保持排序。

我想出什么了现在下面,我想“路线R'”添加到列表中

for (int j = 0; j < POOL.size()-1; j++) 
    { 
     if (apr(r) > apr(j)) 
     { 
      // do nothing 
     } 
     else if (apr(r) < apr(j)) 
     { 
      POOL.add(j,r) 
     } 
     else if (apr(r) == apr(j)) 
     { 
      if (profit(r) > profit(j)) 
      { 
       // do nothing 
      } 
      else if (profit(r) < profit(j)) 
      { 
       POOL.add(j, r) 
      } 
      else if (profit(r) == profit(j)) 
      { 
       if (distance(r) > distance(j)) 
       { 
        // do nothing 
       } 
       else if (distance(r) < distance(j)) 
       { 
        POOL.add(j,r) 
       } 
       else if (distance(r) == distance(j)) 
       { 
        //add 
       } 
      } 
     } 
莫非

这项工作得不错吗?

+1

你有没有尝试过任何代码? –

+0

你想使用什么语言? (如果有的话) –

+0

我一直在考虑代码,但还没有能够提出任何问题。我在Eclipse中编写代码(Java 1.8)@HopefulLlama –

回答

0

在Java中排序依赖于两个接口:可比和比较器。根据您想要的标准,“可比”会创建元素的自然排序。比较器可用于对您的数据进行多次排序。

当通过少数集合提供的方法sort对java集合进行排序时,可以选择使用特定的比较器。如果不指定任何内容,则集合将根据对象的自然顺序进行排序(通过Comparable)。

让我们看看现在这些东西的实现。

可比版本

public class Route implements Comparable<Route> { 
    private String apr; 
    private int distance; 
    private int profit; 

    @Override 
    public int compareTo(Route other) { 
     int aprCompare = apr.compareTo(other.apr); 
     if (aprCompare != 0)    return aprCompare; 
     else if (profit < other.profit)  return -1; 
     else if (profit > other.profit)  return 1; 
     else if (distance < other.distance) return -1; 
     else if (distance > other.distance) return 1; 
     else        return 0; 
    } 
} 

比较版本

比较是一个对象,做了排序为您。按照惯例,比较器与它所比较的​​类不同。所以,让我们写一个:

public class RouteComparator implements Comparator<Route> { 

    @Override 
    public int compare(Route a, Route b) { 
     int aprCompare = a.getApr().compareTo(b.getApr()); 
     if (aprCompare != 0)      return aprCompare; 
     else if (a.getProfit() < b.getProfit())  return -1; 
     else if (a.getProfit() > b.getProfit())  return 1; 
     else if (a.getDistance() < b.getDistance()) return -1; 
     else if (a.getDistance() > b.getDistance()) return 1; 
     else          return 0; 
    } 
} 

排序列表

假设你有一堆列表未排序的数据,你需要插入新的之前给它排序。要使用Comparable接口对List<Rout> list进行排序,请致电list.sort(null)。如果您想使用比较器,请致电list.sort(new RouteComparator())。很简单,你的清单是有效的排序。

如何插入数据,同时保持顺序

这是一个列表,所以最简单的方法是插入数据,同时确保其有序是遍历列表,直到找到一个缺口,插入新Route在那个差距。如果您使用的是ArrayList,则可以通过执行二进制搜索来搜索差距,从而更高效地执行此操作。

但是,如果您没有绑定使用列表,并且您的路由是唯一的,那么您可以使用TreeSet,这是一个有序的数据结构。最好的是,它也使用Comparable/Comparator,你只需在创建时指定它:

TreeSet<Route> t = new TreeSet<>(); 
// Creates a new TreeSet with the natural ordering of Route 

TreeSet<Route> t = new TreeSet<>(new RouteComparator()); 
// Creates a new TreeSet using a Comparator 
1

那么你可以在你的列表中应用一个修改过的Bubble排序算法。这是关于Java(未测试)的示例中,假设对象的与值,利润和距离特性的阵列作为整数

for(int i = 0; i < array.length; i++) { 
    for(int j = 0; j < array.length-1; j++) { 

     if(array[j].value > array[j+1].value || 
      (array[j].value == array[j+1].value && array[j].profit > array[j+1].profit) || 
      (array[j].value == array[j+1].value && array[j].profit == array[j+1].profit && array[j].distance > array[j+1].distance)) { 
      int k = array[j]; 
      array[j] = array[j+1]; 
      array[j+1] = k; 
     } 
    } 
} 
+0

如果有人可以说为什么它是错误的而不是downvote,那将是非常感谢 – gbalduzzi

+1

我想了解你的代码在这一刻。我想插入一个元素,所以我会说我只需要一个for循环? –

+0

这段代码根据您的标准获取元素列表并对它们进行排序,这是众所周知的气泡排序alghoritm(您可以谷歌它)的实现。 如果再要一个值添加到阵列中,并保持它正确排序,您可以添加新的元素作为第一数组,然后只使用内部for循环在我的例子 – gbalduzzi

相关问题