Java как сортировать объекты ArrayList из Point

77
7

Я использую Point Class для управления списком (x, y) координат, и мне нужно отсортировать их по порядку X.


Я читаю онлайн, чтобы создать новый класс PointCompare, который реализует Comparator, однако я не уверен, как это работает, и поэтому у меня есть ошибка компилятора в методе sortByXCoordinates.


Помощь будет оценена очень много, и любые комментарии приветствуются, спасибо заранее.
Вот мой код:


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();

}
}

спросил(а) 2010-11-17T01:06:00+03:00 9 лет назад
5
Решение
69

Ты был близок. Проблема была в том, что вы вызывали


  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();

}
}

ответил(а) 2010-11-17T01:14:00+03:00 9 лет назад
Еще 4 ответа
85

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;
}
}
}

ответил(а) 2010-11-17T01:13:00+03:00 9 лет назад
54

Я проигнорирую весь код, который вы опубликовали, потому что вы только что сбросили все, не тратя времени на определение соответствующих областей.


теперь, из вашего вопроса: у вас есть ArrayList, содержащий Point s. Вы хотите отсортировать его по оси 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);
}
};

Я выбираю "box" int для Integer и использую метод Integer compareTo. Вы можете придумать более аккуратный метод сравнения, вплоть до вас.


Затем вы можете использовать метод утилиты Collections.sort


Collections.sort(list, comp);

и ваш список отсортирован.

ответил(а) 2010-11-17T01:14:00+03:00 9 лет назад
32

Класс ArrayList (см. документацию по API: http://download.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html), который вы используете для своего "CoordList", не имеет метода sort(), Вам придется реализовать это самостоятельно или использовать Collections.sort().

ответил(а) 2010-11-17T01:14:00+03:00 9 лет назад
33

Я использую Point Class для управления списком (x, y) координат, и мне нужно отсортировать их по порядку X



Вы можете использовать Bean Компаратор или пользовательский Компаратор, как описано в блоге.

ответил(а) 2010-11-17T01:09:00+03:00 9 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема