【问题标题】:Java sort based on two columns基于两列的Java排序
【发布时间】:2011-07-29 19:26:47
【问题描述】:

假设我有这样的表:

 String | Int1 | Int2
 "foo"    5      0
 "faa"    4      1
 "zaa"    0      1
 "zoo"    4      2
 "laa"    4      3
 "loo"    1      4

我想要的是这样的表格:

 String | Int1 | Int2
 "foo"    5      0
 "laa"    4      3
 "zoo"    4      2
 "faa"    4      1
 "loo"    1      4
 "zaa"    0      1

发生的第一件事是根据列 Int1 进行排序。

发生的第二件事是基于Int2 列,但仅基于Int1 列中具有相同数字的行

我应该如何在不使用任何数据库引擎的情况下解决这个问题?

【问题讨论】:

  • 为什么不自己写 compareTo() 呢?这是否存储在数据库中?

标签: java sorting multiple-columns


【解决方案1】:

您通常使用List<Item> 来执行此操作,其中Item 是包含所有三个值的类型(例如,第一行的“foo”、5、0)。

然后,您将编写一个 Comparator<Item>,它比较在 compare 中呈现给它的两个 Item 对象的 Int1 值,如果给出了明确的答案,则返回该答案......否则比较Int2 值。

【讨论】:

    【解决方案2】:

    我假设你有一个包含 2 个整数的字符串的对象?

    最简单的方法是让对象实现Comparable 并实现compareTo() 方法。或者您可以将比较器传递给Collections.sort(yourListOfObjects, yourCustomComparator)

    compareTo() 方法将首先比较第一个 int,如果它们相等,则比较第二个 int。

    @Override
    public int compareTo(MyObject o) {
        // compare int1s .. if equal, compare int2s and return 0,1 or -1
    }
    

    这是一个有用的链接

    http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

    【讨论】:

      【解决方案3】:

      你说的表是什么意思还不清楚。但在一般情况下,您可以通过使用Comparator 或使您的数据结构实现Comparable 来对Java 中的数据进行排序。在您的情况下,您将创建一个简单的数据结构来封装表中的一行,然后为行数据结构创建一个Comparator 或让它实现Comparable

      例如

      public class Row implements Comparable<Row> {
          public final String theString;
          public final int int1;
          public final int int2;
      
          public Row(String theString, int int1, int int2) {
              this.theString = theString;
              this.int1 = int1;
              this.int2 = int2;
         }
      
         public int compareTo(Row other) {
             if(this.int1 == other.int1) {
                 return new Integer(this.int2).compareTo(other.int2);
             }
      
             return new Integer(this.int1).compareTo(other.int1);
         }
      }
      

      然后您将创建一个List&lt;Row&gt; 并使用java.util.Collections.sort(List&lt;?&gt;) 对您的数据进行排序。

      【讨论】:

        【解决方案4】:

        如果只有 Java 支持 lambdas……这在很多语言中都是微不足道的。

        但是,嗯,让我们看看。以下是两种通用方法(这些主题有许多不同的变体):

        1. 使用相关成员创建新类型
        2. 使类型实现Comparable(例如“compareTo”)
        3. 将这种新类型的元素放入数组或列表中(可能是List&lt;NewType&gt;
        4. 使用Arrays.sortCollections.sort(或类似名称)

        或者,

        1. 创建嵌套数组或列表(可能是List&lt;List&lt;Object&gt;&gt;
        2. 使用Arrays.sortCollections.sort(或类似的),使用Comparator 的形式

        编码愉快。

        【讨论】:

          【解决方案5】:

          首先定义“表格”的含义。

          我会将每一行包装在一个对象Row 中,并保留这些Rows 的数组。然后您可以实现Comparable&lt;Row&gt; 接口或编写自己的Comparator&lt;Row&gt;

          所以要么:

          ...
          class Row implements Comparable<Row> {
              String s;
              int int1, int2;
          
              ...
          
              public int compareTo( Row r ) {
                  if( int1 != r.int1 ) return int1-r.int1;
                  else return int2-r.int2;
              }
          }
          

          并致电Arrays.sort(rows);

          或者你可以这样做:

          Arrays.sort(rows, new Comparator<Row>() {
              public int compare( Row r1, Row r2 ) {
                  if( r1.int1 != r2.int1 ) return r1.int1-r2.int1;
                  else return r1.int2-r2.int2;
              }
          });
          

          其中rowsRow[]

          【讨论】:

            【解决方案6】:

            这样的?

            public class Item implements Comparable<Item> {
                private String s;
                private Integer int1;
                private Integer int2;
            
                @Override
                public int compareTo(Item o) {
                    int compare = int1.compareTo(o.int1);
                    return compare != 0 ? compare : int2.compareTo(o.int2);
                }
            }
            

            【讨论】:

              【解决方案7】:

              我会在 Comparator 实现中使用 CompareToBuilder。

              示例用法,

                  new Comparator<YourObjectType>() {
                          @Override
                          public int compare(YourObjectType o1, YourObjectType o2) {
                              return new CompareToBuilder()
                                 .append(o1.firstFieldToCompare, o2.firstFieldToCompare)
                                 .append(o1.secondFieldToCompare, o2.secondFieldToCompare)
                                 .toComparison();
                          }
                      }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-04-22
                • 2013-02-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-24
                相关资源
                最近更新 更多