Regex - pomoc przy zadaniu

0

Uczę się samodzielnie javy i mam tutaj takie zadanko do zrobienia:

Pobierz od użytkownika 10 adresów. Stosując wyrażenia regularne dopilnuj, żeby każdy adres miał postać:
ul. NazwaUlicy NumerUlicy KodPocztowy Miasto
NazwaUlicy – wyraz składający się z samych dużych liter
Numer ulicy – liczba z przedziału 10 – 99
KodPocztowy – standardowy kod w formacie xx-xxx
Miasto – jedno z Kraków, Warszawa, Wrocław
Następnie sprawdź, w którym mieście znajduje się najwięcej adresów spośród pobranych.

Mój kod wygląda tak

public class Zad3 {

    static String getAdress() {

        Scanner sc = new Scanner(System.in);
        String adres = "xxx";
        int krakow = 0, warszawa = 0, wroclaw = 0;

        System.out.println("podaj 3 adresy: ");
        for (int i = 0; i < 3; i++) {
            adres = sc.nextLine();

            if (!(adres.matches("ul\\. [A-Z]+ [1-9][0-9] [0-9]{2}-[0-9]{3} (Kraków|Warszawa|Wrocław)"))) {
                System.out.println("Format adresu jest niepoprawny ");
                break;
            }
        }

        return adres;
    }

    public static void main(String[] args) {
        System.out.println(getAdress());
    }
}

Pobieranie adresu w odpowiednim formacie działa. Tylko nie mam pomysłu jak w elegancji sposób wyznaczyć wpis z miastem, które najczęściej wystąpiło.
No i jeśli to co jest już napisane wymaga jakichś optymalizacji to chętnie przyjmę reprymendy ;)

0

Najpierw to musisz sparsować ten długi string na sekcje (wystarczy że wyłuskasz samą nazwę miasta). Następnie używasz np. hashmapy w taki sposób.
static Map<String, Integer> cityCountMap = new HashMap<>(); // najlepiej jako pole statyczne klasy Zad3
po tym if (szkoda, że nie sforamtowałeś tego kodu jako cpp) dajesz coś takiego;

Integer count = cityCountMap.get(cityName); // pod cityName masz wyłuskaną nazwę miasta jako String
if(count == null) {
    cityCountMap.put(cityName, 1);
}
else {
    cityCountMap.put(cityName, ++count);
}

Później coś takiego:

String city = "";
int count = 0;
for(Map.Entry<String, Integer> entry: cityCountMap.entrySet()) {
    if(entry.getValue() > count) {
        count = entry.getValue();
        city = entry.getKey();
    }
}

Albo jeśli wolisz lambdy:

String city = cityCountMap.entrySet().stream()
    .max(Comparator.comparingInt(Map.Entry::getValue))
    .get()
    .getKey();

Uwaga: Kod pisany z pamięci ale koncepcyjnie powinno działać.

0

Jak to zrobić bez użycia map, list, setów?? chodzi mi żeby nie używać obiektówki....

0

Nie skupiaj dużej uwagi na regexach. To jest nieutrzymywalne

0

@Korges: Tak tylko mam takie zadanie i muszę je zrobić...głównie chodzi mi o część zadania:

Następnie sprawdź, w którym mieście znajduje się najwięcej adresów spośród pobranych.

0

Nie rób tak z wyrażeniami regularnymi
adres.matches("ul\\. [A-Z]+ [1-9][0-9] [0-9]{2}-[0-9]{3} (Kraków|Warszawa|Wrocław)")
Regexy to "ciężka" operacja dlatego warto je wpierw skompilować raz i potem używać:

final Pattern p = Pattern.compile("pattern");
p.matcher("test string").matches()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.