通过输入未按预期工作的 HashMap 值获取 HashMap 键
Get HashMap key by inputting HashMap value not working as expected
问题出在方法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
按 phone 号码搜索人:
马蒂
未找到
但输出是:
搜索号码:
佩卡:
014-1234
015-5344
马蒂:
号码:013-4321
按 phone 个号码搜索一个人:
未找到
马蒂
未找到
未找到
为什么输出打印“not found”3 次而不是只打印一次?
您遍历 Map
的所有键并将相应的值与您要查找的值进行比较。如果没有匹配项,则打印 "not found".
你的 Map
有两个键,所以如果你要搜索 Map
中存在的值,你将打印匹配的键,但你也会打印 "not found" 另一个键。
如果您要搜索 Map
中不存在的值,您将打印 "not found" 两次(每个键一次)。
您应该只在遍历所有键后打印 "not found":
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");
}
问题出在方法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
按 phone 号码搜索人:
马蒂
未找到
但输出是:
搜索号码:
佩卡:
014-1234
015-5344
马蒂:
号码:013-4321
按 phone 个号码搜索一个人:
未找到
马蒂
未找到
未找到
为什么输出打印“not found”3 次而不是只打印一次?
您遍历 Map
的所有键并将相应的值与您要查找的值进行比较。如果没有匹配项,则打印 "not found".
你的 Map
有两个键,所以如果你要搜索 Map
中存在的值,你将打印匹配的键,但你也会打印 "not found" 另一个键。
如果您要搜索 Map
中不存在的值,您将打印 "not found" 两次(每个键一次)。
您应该只在遍历所有键后打印 "not found":
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");
}