【问题标题】:How do I implement this Java program using hashmap and arrylist如何使用 hashmap 和 arraylist 实现这个 Java 程序
【发布时间】:2015-06-03 08:56:24
【问题描述】:

厨房里有橱柜和冰箱,我可以在每个橱柜里放和取出产品(奶酪、牛奶和鸡蛋)

这是我的 Kitchen 课程,我使用 hashmap 创建了关于如何在厨房中获取橱柜和冰箱的说明;

import java.util.HashMap;

public class  Kitchen{
    HashMap<String,KitchenCabinet > store = new HashMap<String, KitchenCabinet >();`

    public void  putKitchenCabinet (String name, `KitchenCabinet newKuechenSchrank) {
        store.put(name, newKitchenCabinet);
    }
    public KitchenCabinet getKitchenCabinet (String name){
        KitchenCabinet out = this.store.get(name);
        return out;
    }
}

我还为每个产品(奶酪、牛奶和鸡蛋)创建了一个单独的类,还创建了一个抽象的 Product 类,该类扩展到其他产品类,然后我在 KitchenCabinet 类中使用了一个 Arraylist

这是我的 KitchenCabinet 课程

import java.util.ArrayList;

public  class KitchenCabinet {

    //List of Products here 
    Products vaildProducts;

    ArrayList<Products> superProducts = new ArrayList<Products>();

    public void addProducts(Products myProducts) {
        this.superProducts.add(myProducts);
    }

    public Products getProducts() {
        Products out = this.superProducts.remove(0);
        return out;
    }
}

我如何实现以下内容?

  1. 厨房有 2 个橱柜层(左、右和冰箱)

  2. 冰箱内有 2x 奶酪

  3. 左侧有 2x 牛奶

  4. 右侧有 3x 牛奶

  5. 左侧有 1 个蛋

还有问题

  • 厨房里有多少产品。

  • 厨房里有多少牛奶。

  • 产品 X 在哪个机柜中。

请任何人,我需要你的帮助来实施这个程序。
我对编程很陌生,在这两者之间,我迷路了。提前非常感谢

【问题讨论】:

  • 你刚刚让我们做你的功课。这不是合适的地方。如果你需要帮助,你应该首先说明你的问题到底是什么,你不明白什么。
  • 感谢 Kaiser 的回复,我的问题是我不知道该怎么做,指南会有很大帮助。
  • 很快。 Kitchen 有 3 个地图,其中第一个参数是名称,第二个参数是 2 个橱柜层和冰箱的数组列表。这应该是成功完成家庭作业的足够建议
  • 谢谢,但是谁能帮我写出代码,因为我已经为此工作了将近一个星期,直到没有做对。
  • 如果您无法将我的建议转化为代码,请阅读书籍。如果某些特定的东西不起作用,然后再回来,并发布你到目前为止所做的事情。您不会在这里找到可以为您解决整个硬件问题的人

标签: java arraylist hashmap implementation


【解决方案1】:

因此,这是您所展示内容的解决方案。我建议您不要将此答案作为作业提交,因为您的老师可能会在 Internet 上查找寻求帮助的学生。将其作为您自己更好实施的起点,因为这只是草稿。

需要注意的是,查找一些 java 的命名约定。例如,类通常是单数的,而集合是复数的(当然,这要讨论)。当您处理更复杂的设计时,正确的命名有助于您在代码中定位。

为您的收藏使用菱形符号(我认为在 java 7 中可用?),因为它使您的线条更短更清晰。

//do
HashMap<String,Storage> storages = new HashMap<>();
//don't
HashMap<String,Storage> storages = new HashMap<String,Storage>();

当你有专门的类时,使用 private 关键字隐藏它的成员,特别是如果你不打算直接访问它,在大多数情况下也不应该这样做。

密切注意程序的过度设计。例如,在下面的代码中,没有必要为每个产品创建新类,通常没有程序员会这样做,因为这些类不会添加任何功能,只会增加代码的可读性。

不要实现你不需要的东西。在您的示例中,您实现了从厨房中删除项目的方法,这不是设置任务所必需的。这并不意味着它不利于锻炼,但通常这是浪费时间,而且您认为需要更改的方法中有一半将需要更改或根本不会使用。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class KitchenTest {
    public static void main(String[] args){
        //initialize furniture
        Kitchen kitchen = new Kitchen();
        kitchen.createStorage("Refrigerator");
        kitchen.createStorage("Left Cabinet");
        kitchen.createStorage("Right Cabinet");

        //put products in the kitchen
        kitchen.put("Refrigerator", new Cheese());
        kitchen.put("Refrigerator", new Cheese());
        kitchen.put("Left Cabinet", new Milk());
        kitchen.put("Left Cabinet", new Milk());
        kitchen.put("Left Cabinet", new Egg());
        kitchen.put("Right Cabinet", new Milk());
        kitchen.put("Right Cabinet", new Milk());
        kitchen.put("Right Cabinet", new Milk());

        //how many products in the kitchen
        Map<String, List<Product>> contents = kitchen.find(null);
        int amount = 0;
        for (List<Product> value : contents.values()) {
            amount+=value.size();
        }
        System.out.println("In the kitchen is "+amount+" products.");

        //how many milk bottles
        contents = kitchen.find("Milk");
        amount = 0;
        for (List<Product> value : contents.values()) {
            amount+=value.size();
        }
        System.out.println("In the kitchen is "+amount+" milk bottles.");

        //in which cabinet is what
        contents = kitchen.find(null);
        for (Map.Entry<String, List<Product>> entry : contents.entrySet()) {
            System.out.println("In "+entry.getKey()+" is "+Arrays.toString(entry.getValue().toArray()));
        }
    }
}

class Kitchen{
    private final HashMap<String,Storage> storages = new HashMap<>();

    public void  createStorage(String name) {
        storages.put(name, new Storage());
    }

    public void put(String storageName, Product product){
        if(!storages.containsKey(storageName)){
            throw new RuntimeException("Storage not found!");
        }
        storages.get(storageName).put(product);
    }

    //find specific product occurence in all storages
    public Map<String, List<Product>> find(String productName){
        Map<String, List<Product>> found = new HashMap<>();
        for (String storageName : storages.keySet()) {
            found.put(storageName, storages.get(storageName).find(productName));
        }
        return found;
    }
}

//generic storage place, there is no functional difference between refrigerator
//and cabinets
class Storage {
    private final ArrayList<Product> contents = new ArrayList<>();

    public void put(Product myProducts) {
        this.contents.add(myProducts);
    }

    //iterate over all contents of storage and storages found items in list
    public List<Product> find(String name) {
        List<Product> found = new ArrayList<>();
        for (Product product : contents) {
            //if you put name as null, you will get all products in the storage
            if(name==null || product.name.equals(name)){
                found.add(product);
            }
        }
        return found;
    }
}

//recognized products by name and class
class Product{
    public final String name;
    public Product(String name){
        this.name=name;
    }
    @Override
    public String toString(){return name;}
}
class Milk extends Product{public Milk(){super("Milk");}}
class Cheese extends Product{public Cheese(){super("Cheese");}}
class Egg extends Product{public Egg(){super("Egg");}}

希望对你有帮助, 问候。

【讨论】:

  • 哦,Kaiser,非常感谢你,因为你让我摆脱了几天的挫败感,为此工作了几天,我尝试的越多,我就越困惑,我只有大约 5 周以前进入这个编程世界。这个指南正是我需要实现的,有了这个我知道如何去做。拜托,如果你不介意的话,我想和你说几句话,你可以把你的电话号码给我的电子邮件,yahoo.com 上的 fitiowe。谢谢。
  • “你刚刚让我们做你的功课。这不是合适的地方。” 真的吗?你刚刚做了他的功课,为什么这里不是正确的地方?
  • @Tom,我知道他一开始只是想让我知道我必须自己完成我的任务,而不是把它交给别人为我锻炼,但让他知道我需要一些自己制定的指导方针是他这样做的原因。
  • @Vojtěch Kaiser 再次感谢。我正在自己实施。完成后,我将尝试将其发布在此处。请给我发一封电子邮件,我之前已经把我的地址给你了。
  • @VojtěchKaiser 我想我对那些寻求帮助和代码来完成自己的作业的新用户有太多糟糕的体验。后来他们“承诺”从中学习,但最后他们只是复制并粘贴它,稍后再回来提出更多“给我密码”的问题。但我不知道尼古拉斯是否和他们一样。希望不会。 (顺便说一句:Stackoverflow 也有该行为的名称:Help Vampire
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2015-07-28
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多