java - 通过输入 HashMap 值获取 HashMap key 无法按预期工作

标签 java oop hashmap hashset keyset

问题出在方法getName()

public class Phonebook implements PhonebookInterface {

    private Map<String, Set<String>> phonebook;
    private Map<String, Address> address;

    public Phonebook() {
        this.phonebook = new HashMap<String, Set<String>>();
        this.address = new HashMap<String, Address>();
    }

    @Override
    public void addNumber(String person, String number) {
        if (!this.phonebook.containsKey(person)) {
            this.phonebook.put(person, new HashSet<String>());
        }

        this.phonebook.get(person).add(number);
    }

    @Override
    public void getName(String number) {
        for (String person : this.phonebook.keySet()) {
            if (this.phonebook.get(person).contains(number)) {
                System.out.println(" " + person);
            } else {
                System.out.println("  not found");
            }
        }
    }

    @Override
    public void getNumber(String person) {
        try {
            for (String n : this.phonebook.get(person)) {
                if (this.phonebook.get(person).size() > 1) {
                    System.out.println(" " + n);
                } else {
                    System.out.println("number: " + n);
                }
            }
        } catch (Exception e) {
            System.out.println("  not found");
        }
    }

    public void addAddress(String person, String street, String city) {
        this.address.put(person, new Address(street, city));
    }

    public void getInfo(String person) {
        if (this.address.containsKey(person)) {
            System.out.println("  address: " + this.address.get(person));

            if (this.phonebook.containsKey(person)) {
                System.out.println("  phone numbers:");
                for (String n : this.phonebook.get(person)) {
                    System.out.println("  " + n);
                }
            } else {
                System.out.println("  phone number not found");
            }
        } else {
            System.out.println("  not found");
        }
    }

    public void removeInfo(String person) {
        if (this.address.containsKey(person)) {
            this.address.remove(person);
        } else {
            System.out.println(" not found");
        }
    }
}

public class Address {

    private String street;
    private String city;

    public Address() {
    }

    Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return this.street;
    }

    public String getCity() {
        return this.city;
    }

    public String toString() {
        return this.street + " " + this.city;
    }

}

class Main {

    public static void main(String[] args) {
        Phonebook p = new Phonebook();

        System.out.println("Search for number: ");

        System.out.println("Pekka :");
        p.addNumber("Pekka", "014-1234");
        p.addNumber("Pekka", "015-5344");
        p.getNumber("Pekka");

        System.out.println("Matti :");
        p.addNumber("Matti", "013-4321");
        p.getNumber("Matti");

        System.out.println("\nsearch for a person by phone number: ");

        p.getName("013-4321");
        p.getName("1234567");
    }
}

预期输出是:

搜索号码:
佩卡:
014-1234
015-5344
马蒂:
号码:013-4321

通过电话号码搜索人员:
马蒂
未找到

但是输出是:

搜索号码:
佩卡:
014-1234
015-5344
马蒂:
号码:013-4321

通过电话号码搜索人员:
未找到
马蒂
未找到
未找到

为什么输出打印“未找到”3次而不是一次?

最佳答案

您迭代Map 的所有键,并将相应的值与您要查找的值进行比较。当没有匹配项时,您将打印“未找到”。

您的Map有两个键,因此如果您正在搜索Map中存在的值,您将打印匹配的键,但您也会打印另一个 key “未找到”。

如果您要搜索 Map 中不存在的值,您将打印“not find”两次(每个键一次)。

在迭代所有键后,您应该仅打印“未找到”:

public void getName(String number) {   
    for (String person : this.phonebook.keySet()) {   
        if (this.phonebook.get(person).contains(number)) {   
            System.out.println(" " + person);
            return;
        }    
    }
    System.out.println("  not found"); 
}

关于java - 通过输入 HashMap 值获取 HashMap key 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54921058/

相关文章:

c++ - 如何选择一个类来动态实例化?

java - 如何在文本文件中的两个日期之间进行搜索??? HashMap ?

Java:如何在 HashMap 中获取具有相同值的键集

java - 如何重新设计 java 应用程序以在新线程中提供另一个变量副本?

c++ - OOP 游戏菜单系统开发概念化

java - 无法解析 Map<> 中的方法 'entrySet()'

java - 在业务逻辑之前执行方法

java - 客户端 服务器 Java 应用程序

java - JUnit 可以使用的堆大小是否有上限

Java 将输入从终端传递给函数