【问题标题】:Sorting an ArrayList based on a class data member's data member根据类数据成员的数据成员对 ArrayList 进行排序
【发布时间】:2016-01-24 03:35:18
【问题描述】:

所以,我有一个包含另一个类对象作为其数据成员的类。我基于这个原型创建了一个 ArrayList。代码如下:

    package Stack;

import java.io.*;
import java.util.*;


    class Point
   {
       int x;
       int y;

       Point(int x, int y)
       {
           this.x = x;
           this.y = y;
       }
   }

   public class MergeInterval
   {

       Point P;

       MergeInterval() {}


       public static void main(String args[])
       {
           ArrayList<Point> arr = new ArrayList<Point>();
          // Point p = new Point(6,8);

           arr.add(new Point(6,8));
           arr.add(new Point(1,9));
           arr.add(new Point(2,4));
           arr.add(new Point(4,7));

        //   System.out.println(arr.get(1).x + " " + arr.get(1).y);

       }
   }

我需要对这个 Arraylist 进行排序以获得如下输出: {1,9} {2,4} {4,7} {6,8}

基本上我需要根据类“Point”的“x”变量对这个结构进行排序,但使用内置的“排序”方法。如何实现?

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    List.sort(...) method 采用Comparator,它确定列表中的元素应如何相互比较以确定顺序。您可以自己实现Comparator 以指定应通过比较它们的x 值来比较Points,这需要几行代码,或者您可以使用内置的Comparators 之一。

    Comparator 接口为您希望通过列表元素的简单函数进行比较的情况定义默认实现。

    由于您正在比较 int 属性,因此您可以使用 Comparator.comparingInt,如下所示:

    arr.sort(Comparator.comparingInt(p -> p.x));
    

    【讨论】:

    • 这有帮助。谢谢!
    【解决方案2】:

    像这样创建一个比较器:

    Comparator<Point> comparator = new Comparator<Point>() {
    
        @Override
        public int compare(Point o1, Point o2) {
            return Integer.compare(o1.x, o2.x);
        }
    };
    
    arr.sort(comparator);
    

    您可以在填充列表后添加此代码。

    【讨论】:

    • 它有效,但它有点老派,而且比它可能的更冗长。在 Java 8 中,经常使用Comparator 进行排序的惯用语是将 lambda 表达式传递给方法。匿名内部类是如此,非常... Java 5。
    【解决方案3】:

    实现这一点的一种方法是,如果您的 Point 类实现 Comparable。排序等过程需要进行某种比较。请看看这个link

    在这种情况下,您的 Point 类将实现 Comparable。为此,您的 Point 类还需要 compareTo(Point other) 方法。在您的情况下,如果 this.x == other.x,此函数将返回 0,如果 this.x

    这能回答你的问题吗?

    【讨论】:

    • 为什么Point 需要具有可比性? OP 希望通过 x 值对它们进行排序,这是一个 int。
    • 不是需要排序的Point对象的ArrayList吗?
    • 是的,但是"built in" sort method 需要ComparatorPoint 没有必要成为 Comparable
    • 是的,我只是提供了一个替代解决方案,以更好地解释这个概念,因为 OP 似乎不知道 Comparable。显然,您的答案是一个更巧妙的解决方案。
    • 这么说吧。您的回答充满了根本不正确的陈述:“您的 Point 类需要是 Comparable ”:它“不需要”做任何此类事情。
    猜你喜欢
    • 2013-10-06
    • 2020-04-24
    • 2015-06-26
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多