Преобразование массива в список и приведение типов - PullRequest
0 голосов
/ 24 августа 2018

Motive:

Я создаю приложение для Android, которое выполняет следующие действия.

  1. Считывает точки ввода (типа Point - пользовательский класс).
  2. Рассчитывает крайние точки.
  3. Рисует многоугольник (требуется ввод типа GeoPoint из библиотеки osmdroid) с этими точками в качестве вершин (выпуклый многоугольник).

Проблема:

Я заставил алгоритм работать. Но существует проблема с преобразованием типов данных.

Входными данными является массив Point (Point - это пользовательский класс).

geoPoints = new Point[7];
geoPoints[0] = new Point(new GeoPoint(8.180992, 77.336551));

Но функция osmdroid, которая рисует многоугольник, нуждается в List в качестве входных данных.

List<GeoPoint> gPoints;
polygon.setPoints(gPoints);

Мне удалось преобразовать это в конструкторе Point (), как показано ниже

public Point(GeoPoint geoPoint) {
        this.x = geoPoint.getLatitude();
        this.y = geoPoint.getLongitude();
    }

Но я понятия не имею, как определить тип возвращаемого значения.

ТАК, когда я запускаю код. Я получаю следующую ошибку.

error: incompatible types: inference variable T has incompatible bounds
equality constraints: GeoPoint
lower bounds: Point
where T is a type-variable:
T extends Object declared in method <T>asList(T...)

Функция вызова:

private void callingFunction() {

        geoPoints = new Point[7];
        geoPoints[0] = new Point(new GeoPoint(8.180992, 77.336551));
        geoPoints[1] = new Point(new GeoPoint(8.183966, 77.340353));
        geoPoints[2] = new Point(new GeoPoint(8.179836, 77.336105));
        geoPoints[3] = new Point(new GeoPoint(8.178744, 77.339179));
        geoPoints[4] = new Point(new GeoPoint(8.182155, 77.341925));
        geoPoints[5] = new Point(new GeoPoint(8.181655, 77.339318));
        geoPoints[6] = new Point(new GeoPoint(8.182155, 77.341925));

        polygon = new Polygon();    //see note below
        polygon.setFillColor(Color.parseColor("#80FFE082"));
        polygon.setStrokeColor(Color.parseColor("#FFD54F"));
        polygon.setStrokeWidth(5f);

        ConvexHull cx = new ConvexHull(geoPoints);
        Point C1[]= cx.getConvexHull();

        polygon.setPoints(Arrays.asList(C1));

        map.getOverlayManager().add(polygon);
        map.invalidate();

    }

Примечание:

Использование только List или только Array невозможно, так как

polygon.setPoints(geoPoints)    //needs List<GeoPoint> in callingFunction
Arrays.sort(points);            //requires array of Points in ConvexHull

Все предусмотрено. Как я могу решить эту проблему? Любые виды помощи будут действительно полезны. И спасибо заранее.

1 Ответ

0 голосов
/ 24 августа 2018

Я не уверен, правильно ли я вас понял, но в основном ваша проблема сводится к тому, что у вас есть массив Point объектов, но вместо этого нужен список GeoPoint объектов, верно?И между Point и GeoPoint нет никакой связи, поэтому одно не расширяет другое.

Так почему бы не перевести Point объекты обратно в GeoPoint объекты до рисования многоугольника?

Вы можете отобразить типы в потоке:

ConvexHull cx = new ConvexHull(geoPoints);
Point C1[] = cx.getConvexHull();

polygon.setPoints(Arrays.stream(C1).map(p -> new GeoPoint(p.getX(), p.getY())).collect(Collectors.toList());

Или использовать цикл for:

ConvexHull cx = new ConvexHull(geoPoints);
Point C1[] = cx.getConvexHull();

List<GeoPoint> points = new ArrayList<GeoPoint>(C1.length);
for (int i = 0; i < C1.length; ++i) {
  points.add(new GeoPoint(C1[i].getX(), C1[i].getY()));
}
polygon.setPoints(points);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...