2016-01-23 104 views
1

我有一个矢量的对象。每个对象有三个字段 -如何通过Java中的多个字段来排序对象?

我需要排列这个对象列表,以便它们按这些值递增。我的意思是,v1是先排序的,然后如果v1在任何对象中都是相同的,那么v2是有序的,如果v2是相同的,v3是有序的 - 当你按字母顺序排列单词时,首先命令第一个字符第二个等等。

我知道我想说可能听起来令人困惑,请告诉我,如果我需要重新措辞

因此我需要让我的输入:

object 1: v1 = 5, v2 = 6, v3 = 1; 
object 2: v1 = 7, v2 = 5, v3 = 3; 
object 3: v1 = 5, v2 = 1, v3 = 3; 
object 4: v1 = 2, v2 = 5, v3 = 5; 
object 5: v1 = 8, v2 = 4, v3 = 6; 

像这样订购:

object 4: v1 = 2, v2 = 5, v3 = 5; 
object 3: v1 = 5, v2 = 1, v3 = 3; 
object 1: v1 = 5, v2 = 6, v3 = 1; 
object 2: v1 = 7, v2 = 5, v3 = 3; 
object 5: v1 = 8, v2 = 4, v3 = 6; 

正如你所看到的物体3和1具有相同的V1,因此将被责令V2

请告诉我,如果我需要进一步制定

+0

您可能希望你的类实现“可比”接口: 看到这个SO螺纹: http://stackoverflow.com/questions/3718383/java-class-implements-comparable – Liang

+0

所以,你必须实现['Comparable'](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)接口,然后调用内置['sort'](https: //docs.oracle.com/javase/tutorial/collections/interfaces/order.html)方法。有什么问题? – soon

+0

虐待只是尝试一下,感谢您的快速反应 – John

回答

1

使用a Sort - 用Comparable (on the type) or with a separate Comparator。这些在别处介绍

的“棘手”位是写比较方法不太痛苦。这可以以下的几个模板之一来完成(在伪代码中,compareTo方法是将被写为适当,使得它跟随可比/比较合同):

// Objects supplied to comparing function 
Vector a = .. 
Vector b = .. 

// First component in which the values are not equals 
// establishes a 'winner' 
int cmp = 0; 
if ((cmp = compareTo(a.v1, b.v1)) != 0) return cmp; 
if ((cmp = compareTo(a.v2, b.v2)) != 0) return cmp; 
if ((cmp = compareTo(a.v3, b.v3)) != 0) return cmp; 
return 0; 

有,当然,多种变化包括显式/嵌套if结构和三元条件链。上面的代码是以显示比较单个元素和一致性/可扩展性的单一评估的方式编写的。

对于数字,注意溢出并且结果可能不是整数等,compareTo(n1, n2)有时表示为n1 - n2。如果向量中的值是浮点数,则在进行比较时,可能值得考虑epsilon


这里是逻辑的另一可视化:

if (a.v1 < b.v1) return -1; 
else if (a.v1 > b.v1) return 1; 
else 
    if (a.v2 < b.v2) return -1; 
    else if (a.v2 > b.v2) return 1; 
    else 
    if (a.v3 < b.v3) return -1; 
    else if (a.v3 > b.v3) return 1; 
    else 
     return 0; 
+0

这种方法很有用,谢谢 – John

0

,你可以实现你的类可比_对象

public int compareTo(final ObjectX 2bj1, final ObjectX obj2) { 
...  
} 
+0

当然,但我不认为这本身就涵盖了OP的要求。类似于http://stackoverflow.com/a/3718515/2864740中所示的2轴顺序(可轻松扩展到4轴)将是相关的。 – user2864740

1

使用以下代码进行排序任何数量和排序的任何水平。

import java.util.*; 

public class SortObj implements Comparable{ 

    int v1=0, v2=0, v3=0; 

    public SortObj(int v1, int v2, int v3) { 
     this.v1 = v1; 
     this.v2 = v2; 
     this.v3 = v3; 
    } 

    public static void main(String[] args) { 
     SortObj o1 = new SortObj(1,2,3); 
     SortObj o2 = new SortObj(1,4,3); 
     SortObj o3 = new SortObj(1,50,3); 
     SortObj o4 = new SortObj(1,30,30); 
     SortObj o5 = new SortObj(2,20,3); 
     SortObj o6 = new SortObj(3,20,3); 

     List<SortObj> list = new ArrayList<>(); 
     list.add(o1); 
     list.add(o2); 
     list.add(o3); 
     list.add(o4); 
     list.add(o5); 
     list.add(o6); 

     Collections.sort(list); 
     for(SortObj sortObj : list){ 
      System.out.println(sortObj.toString()); 
     } 
    } 


    @Override 
    public String toString() { 
     return String.format("%02d", v1)+ 
       String.format("%02d", v2)+ 
       String.format("%02d", v3); 
    } 
    @Override 
    public int compareTo(Object o) { 
     return this.toString().compareTo(o.toString()); 
    } 
} 
+0

String.format的这种用法很聪明,但有一些缺点需要指出。上述代码只有在所有组件值都在[0..99。范围内)时才能保证工作。超出此范围的值(包括负数)将产生意外结果。 – user2864740

+0

是的,但是这是一种线索,我们可以推广和验证自定义,即String.format与自定义级别的格式到第n个数字填充。 –

+0

即使使用任意(但经过精心选择)的填充级别,当引入负数时,字符串方法也会失败:“-1”在*“-2”之前排序*,尽管数量较大。 – user2864740

相关问题