【问题标题】:Java how to sort an ArrayList of Point objectsJava如何对Point对象的ArrayList进行排序
【发布时间】:2011-05-11 02:45:04
【问题描述】:

我正在使用 Point Class 来管理 (x,y) 坐标列表,我需要按 X 的顺序对它们进行排序。

我在线阅读以创建一个实现 Comparator 的新类 PointCompare,但我不确定它是如何工作的,因此我在 sortByXCoordinates 方法中出现编译器错误。

非常感谢您的帮助,欢迎任何 cmets,在此先感谢。 这是我的一些代码:

import javax.swing.JOptionPane;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
//import java.util.Iterator;

public class ConvexHullMain {

 private Point coordinates = new Point(0, 0);
 private final int MAX_POINTS = 3;
 private ArrayList<Point> coordinateList = new ArrayList<Point>();

 public void inputCoordinates() {

  String tempString; // temp string for JOptionPane
  int tempx = 0;
  int tempy = 0;

  for (int i = 0; i < MAX_POINTS; i++) {
   try {
    // input x coordinates
    tempString = JOptionPane.showInputDialog(null,
      "Enter X coordinate:");
    tempx = Integer.parseInt(tempString);

    // input y coordinates
    tempString = JOptionPane.showInputDialog(null,
      "Enter Y coordinate:");
    tempy = Integer.parseInt(tempString);

    coordinates.setLocation(tempx, tempy);// set input data into
              // coordinates object
    coordinateList.add(coordinates.getLocation()); // put in
                // arrayList

   } // end Try
   catch (NumberFormatException e) {
    System.err.println("ERROR!");
    main(null);

   } // end catch

  }// end for loop

 }

 public void displayPoints() {

  for (int i = 0; i < MAX_POINTS; i++) {

   JOptionPane.showMessageDialog(null, "Point number " + (i + 1)
     + " is: " + coordinateList.get(i));

  }

  // alt method
  // Iterator i = coordinateList.iterator();
  // String outputTemp;
  // while (i.hasNext()) {
  // outputTemp = i.next().toString();
  // JOptionPane.showMessageDialog(null, "Point number " + " is: "
  // + outputTemp);
  // }

 }


 /**
  * This sorts the points by the X coordinates
  */
  public void sortByXCoordinates(){

   coordinateList.sort(coordinates, new PointCompare());
  }

   public class PointCompare implements Comparator<Point> {

   public int compare(Point a, Point b) {
    if (a.x < b.x) {
     return -1;
    } else if (a.x > b.x) {
     return 1;
    } else {
     return 0;
    }
   }
   }

   public static void main(String[] args) {
  ConvexHullMain main = new ConvexHullMain();

  main.inputCoordinates();
  main.displayPoints();


 }
}

【问题讨论】:

    标签: java sorting arraylist comparator


    【解决方案1】:
    private ArrayList<Point> coordinateList = new ArrayList<Point>();
    

    ...

    Collections.sort(coordinateList, new PointCompare());
    

    ...

    public class PointCompare implements Comparator<Point> {
        public int compare(Point a, Point b) {
            if (a.x < b.x) {
                return -1;
            }
            else if (a.x > b.x) {
                return 1;
            }
            else {
                return 0;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      你很亲密。您遇到的问题只是您调用了

        public void sortByXCoordinates(){
      
         coordinateList.sort(coordinates, new PointCompare());
      
        }
      

      你想要的是这个:

      import java.awt.Point;
      import java.util.ArrayList;
      import java.util.Collections;
      import java.util.Comparator;
      
      import javax.swing.JOptionPane;
      
      public class MainClass {
      
          private final Point coordinates = new Point(0, 0);
          private final int MAX_POINTS = 3;
          private final ArrayList<Point> coordinateList = new ArrayList<Point>();
      
          public void inputCoordinates() {
      
              String tempString;
              int tempx = 0;
              int tempy = 0;
      
              for (int i = 0; i < this.MAX_POINTS; i++) {
                  try {
                      tempString = JOptionPane.showInputDialog(null, "Enter X coordinate:");
                      tempx = Integer.parseInt(tempString);
                      tempString = JOptionPane.showInputDialog(null, "Enter Y coordinate:");
                      tempy = Integer.parseInt(tempString);
                      this.coordinates.setLocation(tempx, tempy);// set input data into
                      this.coordinateList.add(this.coordinates.getLocation()); // put in
                  }
                  catch (final NumberFormatException e) {
                      System.err.println("ERROR!");
                      main(null);
      
                  }
              }
          }
      
          public void displayPoints() {
      
              for (int i = 0; i < this.MAX_POINTS; i++) {
      
                  JOptionPane.showMessageDialog(null, "Point number " + (i + 1) + " is: " + this.coordinateList.get(i));
      
              }
      
          }
      
          /**
           * This sorts the points by the X coordinates
           */
          public void sortByXCoordinates() {
      
              Collections.sort(this.coordinateList, new PointCompare());
      
          }
      
          public class PointCompare
              implements Comparator<Point> {
      
              public int compare(final Point a, final Point b) {
                  if (a.x < b.x) {
                      return -1;
                  }
                  else if (a.x > b.x) {
                      return 1;
                  }
                  else {
                      return 0;
                  }
              }
          }
      
          public static void main(final String[] args) {
              final MainClass main = new MainClass();
      
              main.inputCoordinates();
              main.displayPoints();
      
          }
      }
      

      【讨论】:

        【解决方案3】:

        我将忽略您发布的所有代码,因为您只是丢弃了所有内容而没有花时间识别相关区域。

        现在,根据您的问题:您有一个包含Points 的ArrayList。您想按 X 轴/值对其进行排序。

        List<Point> list = new ArrayList<Point>();
        

        首先,您需要一个Comparator,它将一个Point 与另一个进行比较。

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

        我选择将 int “装箱”为 Integer 并使用 Integer 的 compareTo 方法。你可以想出一个更简洁的比较方法,这取决于你。

        那么就可以使用实用方法Collections.sort

        Collections.sort(list, comp);
        

        您的列表已排序。

        【讨论】:

          【解决方案4】:

          我正在使用 Point Class 来管理 (x,y) 坐标列表,我需要按 X 的顺序对它们进行排序

          您可以使用Bean Comparator 或博客中描述的自定义比较器。

          【讨论】:

          • 非常感谢。这样我就不用编写冒泡排序来手动排序了!
          • >使用冒泡排序。一次也没有。
          【解决方案5】:

          用于“coordinateList”的 ArrayList 类(参见 API 文档:http://download.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html)没有 sort() 方法。您必须自己实现,或使用 Collections.sort()。

          【讨论】:

            猜你喜欢
            • 2012-04-26
            • 2014-11-09
            • 2013-01-06
            • 2015-12-27
            • 1970-01-01
            • 2017-12-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多