java hashmap/wywolanie wartosci pary

0

Dzień dobry. Tworzę program do ktorego sie wpisuje pary imion, ktore sa przechowywane w hashmapie. System po wpisaniu imienia przez uzytkownika wyswietla drugie imie z pary. Przy wykonywaniu sie programu wywoluje sie instrukcja else z return a instrukcje z pokazaniem imienia sa ignorowane. Moze ktos powiedziec dlaczego i jak to mozna poprawic?

public class Zadanie3 {

public static void main(String[] args) {

          
    Map<String, String> mapaImion = new HashMap();
    
    Scanner scanner = new Scanner(System.in);
    System.out.println("ALERT:Aby przerwać wprowadzanie wpisz '-'");
while(true){    
    System.out.println("Podaj pierwsze imię z pary");
    String imie1 = scanner.nextLine();
    System.out.println("Podaj drugie imię z pary");
    String imie2 = scanner.nextLine();
    
    if(imie1.equals("-")){
        System.out.println("Podaj imię osoby, której parę chcesz sprawdzić");
        String imie = scanner.nextLine();
        if(mapaImion.containsKey(imie)&&(imie.equals(imie1))){
            System.out.println(mapaImion.get(imie2));
        }
        else if(mapaImion.containsKey(imie)&&(imie.equals(imie2))){
            System.out.println(mapaImion.get(imie1));
        }
        else
            System.out.println("Błąd");
            return;
        
    }
    else
        mapaImion.put(imie1, imie2);
        
    System.out.println(mapaImion);
    
    }
0

Wg mnie te ify nie mają sensu, wystarczy po prostu:

                String imie = scanner.nextLine();
                System.out.println(mapaImion.getOrDefault(imie, "Brak pary"));
                return;

Przy czym jeśli chcesz żeby szukanie działało "w obie strony" to przy dodawaniu do mapy musisz uwzględnić obie strony:

mapaImion.put(imie1, imie2);
mapaImion.put(imie2, imie1);

Jeśli chcesz, żeby panowała monogamia i każdy mógł być tylko w jednym związku to musisz doimplementować dodatkową logikę :)

0

Ify dalem bo w poleceniu jest zeby byla mozliwosc zakonczenia wypisywania imion jak sie wpisze "-". Tym razem funkcja z imieniem sie czyta ale przy zwracaniu imienia z pary zwracan null

if(imie1.equals("-")){
System.out.println("Podaj imię osoby, której parę chcesz sprawdzić");
String imie = scanner.nextLine();
if(imie.equals(imie1)){
System.out.println("Imię z pary to: " + mapaImion.get(imie2));
}
else{
System.out.println("Imię z pary to: " + mapaImion.get(imie1));
}
return;

0

Hej, wydaje mi się, że najłatwiej będzie to zrobić poprzez stworzenie swojej klasy, która będzie przechowywać pierwsze i drugie imię coś w stylu:

class NamePair {

    private final String firstName;
    private final String secondName;

    public NamePair(String firstName, String secondName) {
        this.firstName = firstName;
        this.secondName = secondName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getSecondName() {
        return secondName;
    }

    @Override
    public String toString() {
        return "firstName='" + firstName + '\'' +
                ", secondName='" + secondName;
    }
}

Tworzyć obiekt będziesz przez konstruktor podając mu te imiona wprowadzone z klawiatury. Trzymałbym te obiekty w Secie i następnie filtrował podając za Predicate coś takiego:

private static Predicate<NamePair> containsName(String name) {
        return namePair -> namePair.getFirstName().equals(name) || namePair.getSecondName().equals(name);
    }

Rozwiązanie krótkie i proste pod warunkiem, że w podstawowym stopniu ogarniasz strumienie oraz nie masz wymogu zastosowania tutaj mapy. Z mojego punktu widzenia Mapa tutaj jest słabym pomysłem bo spore szanse, że imię się powtórzy a jak pewnie wiesz (lub nie) klucz w mapie musi być unikalny. Jeżeli masz jakieś konkretne wymagania jak musisz zrobić to zadania to wymień wszystko ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1