Как разобрать эту строку координат широты / долготы в java? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть строка pointString.

, и я пытаюсь получить из них числовые значения и добавить их в новые переменные LatLng.

Вот мой код

private ArrayList<LatLng> ConvertPoints (String pointsStringInput){
        ArrayList <LatLng> points = new ArrayList<LatLng>();
        String pointsString = pointsStringInput.substring(1, pointsStringInput.length()-1);
        for (int i = 0; i < pointsString.split("lat/lng: ").length; i++){
            Log.w("INDEX", String.valueOf(i));
            if (!pointsString.split("lat/lng: ")[i].matches("none12323232321412515152124214412")){
                points.add(new LatLng (Double.parseDouble(pointsString.split("lat/lng: ")[i].split(",")[0].replace("\\(", "")), Double.parseDouble(pointsString.split("lat/lng: ")[i].split(",")[1].replace("\\)", ""))));
            }
        }
        return points;

    }

всегда происходит сбой при I = 0, с java .lang.NumberFormatException: empty String

1 Ответ

2 голосов
/ 08 апреля 2020

Вы использовали pointsString.split("lat/lng: ") 4 раза, но никогда не распечатывали, но оно имеет значение следующее. При разделении вы получаете части, которые находятся до и после разделителя, поэтому у вас есть пустой контент перед первым.

[, (43.8457509,-79.45568817), , (43.8457509,-79.45568817), , (43.84598041,-79.45584389), , (43.845954,-79.45585094]

Чем проще использовать регулярное выражение, как вы знаете идеально, как данные должны быть lat/lng: \((-?\d+\.\d+),(-?\d+\.\d+)\)

  • \( и \), чтобы соответствовать реальной скобке
  • -?, чтобы соответствовать в конечном итоге минус
  • \d+\.\d+, чтобы соответствовать значениям

  • lat/lng: \(-?\d+\.\d+,-?\d+\.\d+\) окончательное регулярное выражение, затем просто добавьте () для ввода значений

private ArrayList<LatLng> ConvertPoints(String pointsStringInput) {
    ArrayList<LatLng> points = new ArrayList<>();
    Matcher m = Pattern.compile("lat/lng: \\((-?\\d+\\.\\d+),(-?\\d+\\.\\d+)\\)").matcher(pointsStringInput);
    while (m.find()) {
        points.add(new LatLng(Double.parseDouble(m.group(1)), Double.parseDouble(m.group(2))));
    }
    return points;
}

Версия с Stream<MatchResult> равна

private List<LatLng> ConvertPoints(String pointsStringInput) {
    return Pattern.compile("lat/lng: \\((-?\\d+\\.\\d+),(-?\\d+\\.\\d+)\\)")
            .matcher(pointsStringInput).results()
            .map(m -> new LatLng(Double.parseDouble(m.group(1)), Double.parseDouble(m.group(2))))
            .collect(Collectors.toList());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...