Помогите с Hashmaps в Java - PullRequest
0 голосов
/ 14 мая 2010

Я не уверен, как я использую get () для получения моей информации. Глядя на мою книгу, они передают ключ get (). Я думал, что get () возвращает объект, связанный с этим ключом, просматривая документацию. Но я, должно быть, тут что-то не так делаю ... Есть мысли?

import java.util.*;

public class OrganizeThis 
{
    /** 
    Add a person to the organizer

    @param p A person object
    */
    public void add(Person p)
    {   
        staff.put(p, p.getEmail());
        System.out.println("Person " + p + "added");
    }

    /**
    * Find the person stored in the organizer with the email address.
    * Note, each person will have a unique email address.
    * 
    * @param email The person email address you are looking for.
    *
    */
    public Person findByEmail(String email)
    {
        Person aPerson = staff.get(email);
        return aPerson;
    }

    private Map<Person, String> staff = new HashMap<Person, String>();

    public static void main(String[] args)
    {
        OrganizeThis testObj = new OrganizeThis();
        Person person1 = new Person("J", "W", "111-222-3333", "JW@ucsd.edu");
        testObj.add(person1);

        System.out.println(testObj.findByEmail("JW@ucsd.edu"));
    }
}

Ответы [ 3 ]

7 голосов
/ 14 мая 2010

То, что вы делаете неправильно, вы вводите ключ и значение в обратном порядке (при условии, что вы хотите, чтобы адрес электронной почты был ключом). В документах видно, что подпись для put принимает (key, value).

Изменение

staff.put(p, p.getEmail());

до

staff.put(p.getEmail(), p);

и

private Map<Person, String> staff = new HashMap<Person, String>();

до

private Map<String, Person> staff = new HashMap<String, Person>();

Теперь вы сможете найти Person по его адресу электронной почты.

0 голосов
/ 14 мая 2010

Вот фрагмент, демонстрирующий большинство функций Map:

import java.util.*;
public class MapExample {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("One", 1);
        map.put("Two", 2);
        map.put("Three", 3);

        System.out.println(map.size()); // prints "3"
        System.out.println(map);
        // prints "{Three=3, One=1, Two=2}"

        // HashMap allows null keys and values
        // Map also allows several keys to map to the same values
        map.put(null, 1);
        map.put("?", null);

        System.out.println(map.size()); // prints "5"
        System.out.println(map);
        // prints "{null=1, Three=3, ?=null, One=1, Two=2}"

        // get values mapped by key
        System.out.println(map.get("One")); // prints "1"
        System.out.println(map.get("Two")); // prints "2"
        System.out.println(map.get("Three")); // prints "3"

        // get returns null if
        //   (i) there's no such key, or
        //   (ii) there's such key, and it's mapped to null
        System.out.println(map.get("Four") == null); // prints "true"
        System.out.println(map.get("?") == null); // prints "true"

        // use containsKey to check if map contains key
        System.out.println(map.containsKey("Four")); // prints "false"
        System.out.println(map.containsKey("?")); // prints "true"

        // use keySet() to get view of keys
        Set<String> keys = map.keySet();
        System.out.println(keys);
        // prints "[null, Three, ?, One, Two]"

        // the view supports removal
        keys.remove("Three");
        System.out.println(map);
        // prints "{null=1, ?=null, One=1, Two=2}"

        // use values() to get view of values
        Collection<Integer> values = map.values();
        System.out.println(values);
        // prints "[1, null, 1, 2]"

        // the view supports removal
        values.remove(null);
        System.out.println(map);
        // prints "{null=1, One=1, Two=2}"

        values.remove(1); // removes at most one mapping
        System.out.println(map);
        // prints "{One=1, Two=2}"

        // iterating all entries using for-each
        for (Map.Entry<String,Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "->" + entry.getValue());
        }
        // prints "One->1", "Two->2"

        map.clear();
        System.out.println(map.isEmpty()); // prints "true"
    }
}
0 голосов
/ 14 мая 2010

Важно понимать, что карты направлены . То есть, если у вас есть Map<Person, Date>, в котором хранятся дни рождения, тогда легко найти день рождения любого человека и невозможно найти человека, именинного на день рождения (может быть ноль или более одного).

Теперь, хотите ли вы найти адрес электронной почты человека или адрес электронной почты? Ваш код смешивает эти вещи:

  • Вы объявляете карту Map<Person,String>, предполагая, что вы будете использовать Persons в качестве ключа и Strings в качестве значения, то есть искать адрес электронной почты человека.
  • Вы добавляете данные с помощью staff.put(p, p.getEmail()), что также предполагает, что вы будете использовать Персоны в качестве ключа.
  • Но вы пытаетесь определить метод findByEmail, который бы обязательно использовал адрес электронной почты в качестве ключа - это наоборот, как вы настроили свою карту.

Итак, карта может идти только в одном направлении. Вы сами решаете, в каком направлении это происходит, но вы должны быть последовательными. Если вам нужно выполнять поиск в обоих направлениях, рассмотрите возможность использования двух карт!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...