【问题标题】:Hashmap using which key and value to search name and phonenumberHashmap 使用哪个键和值来搜索姓名和电话号码
【发布时间】:2014-05-09 11:22:14
【问题描述】:

我要求在地图中输入“Name”和“phonenumber”。 我不明白我把key 和value 放在hashmap 中的哪个东西。 我的要求是我们可以用电话号码命名并用名字搜索。

喜欢姓名:“sanjay”电话号码:“111”;

姓名:“Krish”电话号码:“222”;

如果我搜索“sanjay”,稍后按名称搜索它,它会提供我 sanjay 的电话号码。

而且,同名的用户不止一个,而一个用户的电话号码可能不止一个。

谢谢。

【问题讨论】:

  • 如果 Sanjay 不止一个,您如何知道要返回哪个电话号码?在您提到该要求之前,您所讨论的所有内容都只是非常基本的地图用法(例如Map<String, Collection<String>>,其中键是名称,值是电话号码)。
  • @Duncan 那么我会把“Person”类放在里面吗?..请建议
  • 您将需要不同的查找键。有了这些元素,您就不能使用地图了。

标签: java collections hashmap


【解决方案1】:

如果您有 Person 类,请制作如下地图:Map<Person, Collection<String>>。

然后您可以通过 map.get(somePerson) 查找电话号码,如果此人不存在,则返回 null。

您还可以考虑创建一个PhoneNumber 类,其中包含经过验证的电话号码的字符串值:Map<Person, Collection<PhoneNumber>>。

【讨论】:

    【解决方案2】:

    使用类包装器:

    public class Person {
    
        private List<String> phoneNumbers;
        private String fullName;
    
        //getters, setters, constructors for field values
    
        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Person) {
                return false;
            }
            Person p = (Person) o;
            return this.fullName.equals(p.fullName); //and other qualifying things
        }
    
        @Override
        public int hashcode() {
            //account for fields that you use in #equals(Object)
        }
    
     }
    

    然后你可以根据你想要的任何索引:

     /* Full name => People */
     Map<String, List<Person>> people = new HashMap<>();
     /* Number => Person */
     Map<String, Person> people = new HashMap<>();
    

    请记住,如果您只比较 equals(Object) 中的名称,您就回到了原点。添加更多的东西进行比较以与唯一性保持一致。

    【讨论】:

    • 为什么phonenumber是String类型的?
    • 它通常可以用数字以外的东西解析,例如+ 或 #.
    【解决方案3】:

    哈希映射的强大功能是能够以 O(1) 的效率找到值。 为此,键必须是您搜索的对象。

    例如,如果您想按名称搜索,那么您的键应该是名称。 由于一个人可以有多个电话号码,因此该值应该是电话号码列表。

    如果你想根据电话号码找到人名,你应该反过来处理 - 键是电话号码,值是人名。

    也许你想要两个……

    【讨论】:

      【解决方案4】:

      上面有很好的答案,可能这也有帮助

      这里 Student 通过覆盖 hashCode() 和 equals() 方法作为键。

      public class Student {
      
              public String studentId;
              public String studentName;
              public Student(String studentId, String studentName) {
                  this.studentId=studentId;
                  this.studentName =studentName;
      
              }
              @Override
              public int hashCode() {
                  return 1234;
              }
              @Override
              public boolean equals(Object o) {
                  if (o instanceof Student) {
                      Student student=(Student)o;
                      if (this.studentId.equalsIgnoreCase(student.studentId)) {
                          return true;
                      } else {
                          return false;
                      }
                  } else {
                      return false;
                  }
              }
          }
      

      电话号码类:

      public class PhoneNumber {
              public String phoneNumber;
              public PhoneNumber(String phoneNumber) {
                  this.phoneNumber =phoneNumber;
              }
      }
      

      人物类:

      import java.util.HashMap;
      import java.util.Set;
      import java.util.List;
      import com.google.common.collect.Lists;
      
      public class Person {
              public static void main(String[] args) {
                  Student e1=new Student("e001","studentOne");
                  Student e2=new Student("e002","studentTwo");
      
      
                  PhoneNumber d1 = new PhoneNumber("9999999998");
                  PhoneNumber d2 = new PhoneNumber("9999999999");
                  List listOfPhoneNumbersOfStudentOne = Lists.newArrayList(d1,d2);
      
                  PhoneNumber d3 = new PhoneNumber("9999999997");
                  PhoneNumber d4 = new PhoneNumber("9999999996");
                  List listOfPhoneNumbersOfStudentTwo = Lists.newArrayList(d3,d4);
      
      /* Here Student made as key by overriding hashCode() and equals() method.*/
      
                  HashMap<Student, List<PhoneNumber>> map=new HashMap<Student, List<PhoneNumber>>();
                  map.put(e1, listOfPhoneNumbersOfStudentOne);
                  map.put(e2, listOfPhoneNumbersOfStudentTwo);
      
                  Set<Student> key=map.keySet();
                  for (Student student : key) {
                      System.out.println(student.studentId+" "+student.studentName +" ");
      
      
                  }
              }
      
          }
      

      【讨论】:

        【解决方案5】:

        公开课作业4 { HashMap map = new HashMap();

        public void addContact(String name, Integer number) {
            map.put(name, number);
        
        }
        
        public void getphoneNumber(String name) {
            if (map.containsKey(name)) {
                Integer a = map.get(name);
                System.out.println("Contact of " +name+" is " + a);
            }
        }
        
        public static void main(String[] args) {
        
            Assignment4 a4 = new Assignment4();
            a4.addContact("vishal", 10345);
            a4.addContact("sachin", 30456);
            a4.addContact("sai", 30458);
            Scanner s=new Scanner(System.in);
            System.out.println("Enter name to get contact details");
            a4.getphoneNumber(s.next());
            s.close();
        
        }
        

        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-14
          • 2021-12-29
          • 1970-01-01
          • 1970-01-01
          • 2017-10-06
          • 2012-04-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多