【问题标题】:how to return objects from hashmap如何从 hashmap 返回对象
【发布时间】:2015-01-09 16:20:14
【问题描述】:
Car c1 = new Car();
Car c2 = new Car();

HashMap<String,Car> hm= new HashMap<String, Car>();
hm.put("Ford",c1);
hm.put("Volvo",c2);

如何迭代以仅获取要打印的值(仅名称)?

输出应该是:
c1
c2

不是下面的:
c1@13efr5t4
c2@234fvdf4

【问题讨论】:

  • 您希望输出为c1c2
  • 看起来你正在打印一个对象的默认 toString,它打印对象名称后跟@[内存地址]
  • @cyroxis:是的,你是对的。我不知道如何编写重写的 toString 方法的定义,以便只获取 c1 和 c2。

标签: java collections iterator hashmap


【解决方案1】:

第 1 步:首先您必须覆盖 Car 类中的 toString() 方法。

public class Car {
    // attribute
    private final String name;

    // Constructor
    public Car(final String name) {
        this.name = name;
    }

    // getter
    public String getName() {
        return name;
    }

    // Override of toString
    @Override
    public String toString() {
        return name;
    }
}

如果您没有实现正确的 toString 方法,则在您调用 System.out.println(car) 时将使用来自 Object 的方法,并且该实现返回以下内容(这是您在当前打印中看到的内容):

return getClass().getName() + "@" + Integer.toHexString(hashCode());

从上面的类创建一个新的Car 的方法是调用以下构造函数:

Car c = new Car("Ford");

第 2 步:使用循环进行迭代。 使用Map 时,您可以选择遍历条目。所有这三个选项都返回某种CollectionCollections 可以使用各种类型的循环进行迭代。

// Standard Java 5+ foreach-loop that prints the values
for (Car c : hm.values()) {
    System.out.println(c);
}

// Loop using an iterator that prints the keys
for (Iterator<Car> itr = hm.keys().iterator(); itr.hasNext(); ) {
    System.out.println(itr.next());
}

// Or a Java 8 loop
hm.values().forEach(System.out::println);

如果您想要地图的键(“Ford”、“Volvo”),您可以将调用 values() 替换为调用 keySet()。对于条目,调用 entrySet() 方法,该方法返回一个 Map.Entry 对象,您可以在其中获取键(通过 getKey() 和通过 getValue() 的值)。

【讨论】:

  • 您好 wassgren,感谢您对默认 toString 方法的工作的解释。但是,我应该使用迭代器从 HashMap 中获取值。另外,当我说 Car c1 = new Car();我没有将任何名称传递给构造函数,也没有像 getName() 这样的实例方法。鉴于这些条件,是否可以只打印 c1 和 c2?另外,如果您能告诉我如何通过覆盖 toString() 来打印 c1 和 c2,我将不胜感激。谢谢
  • @SukhenduRana,我已更新答案以进一步说明您的后续问题。
  • 现在我明白了。非常感谢。
【解决方案2】:
HashMap<String,Car> hm= new HashMap<String, Car>();
hm.put("Ford",c1);
hm.put("Volvo",c2);

在您的哈希映射中,您放置的对象不是字符串。

当您将对象打印为字符串时,它正在输出

c1@13efr5t4
c2@234fvdf4

如果您想打印假设汽车名称,请使用以下方式,或者您必须在 Car 中实现 toString() 方法,这将为您提供预期的输出。

for (Car c : hm.values()) {
    System.out.println(c.getCarName());
}

【讨论】:

    【解决方案3】:

    没有return直接可以这样用

    for (Car c : hm.values()) {
    System.out.printf(c);} 
    

    【讨论】:

    • 你认为他们的输出来自哪里?
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 2011-07-27
    • 2020-04-30
    相关资源
    最近更新 更多