当项目存储在Arr[0]中时,我如何确定项目是否存在于大小为2的数组的哈希集中?

我正在尝试为大学的家庭作业创建一个储物柜类和一个长期存储类。他们都应该能够存储一个由我们的老师制作的具有体积和类型的 Item 对象。(而每个储物柜的存储单元数量有限,长期存储的固定数量为1000个单元。我正在尝试决定如何以最佳方式实现存储。我想过创建一个Arrae,因为我知道一般来说,1000个项目的顶部并不多,但我想写出我能写出最好和最有效的代码,并且对它们的顺序并不重要。我们刚刚了解了哈希集,所以我考虑过创建一个哈希集,这使我的程序的运行时变得更好。问题是我需要计算每种类型存储的项目数量,并且集不允许重复。因此,我想也许可以创建一个长度为2的数组哈希集,以跟踪一种类型的项目及其在存储中的数量。

我真的不确定实现这种存储的最佳方法是什么,也许我选择了绝对错误的方式。在我看来,当我想从1000中找到一种特定类型的项目时,简单的数组不是很有效。(如果长期存储中存储了1000个不同类型和体积为1的不同项目)。

一个额外的问题:在这个练习中,我应该使用TDD方法(测试驱动开发),我不确定如何正确实现测试代码。帮助将不胜感激。(应该与 J 单元和断言一起使用)。

我的代码开头的示例:


import oop.ex3.spaceship.*;


import java.lang.reflect.Array;

import java.util.*;


public class Locker {


    private static final int TOO_MANY_ITEMS = -1;

    private static final int WORKED_WELL = 0;

    private static final int MOVED_TO_LONG_TERM = 1;


    private final int capacity;

    private int currentLoad;

    private HashSet<Item> itemsStored;


    public Locker(int capacity){

        this.capacity = capacity;

        this.currentLoad = 0;

        itemsStored = new HashSet<>();

    }


    public int addItem(Item item, int n){

        if (currentLoad + n*item.getVolume() < capacity){



        }

        else{

            return this.TOO_MANY_ITEMS;

        }

        return 0;

    }


陪伴而非守候
浏览 118回答 1
1回答

慕妹3146593

博士请考虑使用哈希映射而不是哈希集。具体来说,考虑HashMap<KeyType, Object[]>,或者,甚至更好,HashMap<KeyType, ItemWrapper>其中,KeyType 是项类中的字符串、整数或某种其他类型的唯一标识符,而 ItemWrapper 是用于存储相关数据的简单类。哈希映射可能比哈希集更适合于此您说您不想使用数组,因为您希望使用标识符而不是添加顺序的标识符进行快速检索。您还希望将商品“映射”到数量计数。哈希映射将允许您将键与值相关联,以便快速查找。我们将从一个过于简单的实现开始,然后让它变得更好。我还将展示如何像您要求的那样使用大小为 2 的数组,即使这不是最佳方法。我们将改进的基本实现在过于简单的实现中,您的密钥可能是您的 Item,您的值可能是数量。例如&nbsp; &nbsp; &nbsp; &nbsp; HashMap<Item, Integer> myHashMap = new HashMap<Item, Integer>(1400);&nbsp; &nbsp; &nbsp; &nbsp; public int addItem(Item item, int n) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int currentCount = myHashMap.getOrDefault(item, 0);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myHashMap.put(item, n + currentCount);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public int quantityOf(Item item) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myHashMap.getOrDefault(item, 0);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public boolean isInLocker(Item item) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myHashMap.containsKey(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //or return this.quantityOf(item) > 0;&nbsp; &nbsp; &nbsp; &nbsp; }(请注意,此代码依赖于自动装箱和取消装箱,但如果您愿意,可以在没有它的情况下编写。此外,您还可以调整哈希图的初始容量。初始容量为 1400,负载系数为 .75,一旦 HashMap 中出现大约 1050 个项目,它将调整大小。这样做的麻烦在于,您需要已经拥有 Item 对象才能查找该项目,这在大多数情况下可能不切实际。(或者,至少,您需要具有相同结果的东西,并且返回为 true)。如果适用,可以在 Item 类中添加 和 。但是,如果为您提供了 Item 类,则不允许更改它(或不想更改),并且 和 不满足快速查找的需求,该怎么办?在这种情况下,您必须具有不同的键,例如 item ID 或唯一描述符(例如,如果程序中所有“铅笔”项的处理方式相同,则字符串将起作用)。hashCode()equals()@OverrideshashCode()equals()hashCodes()equals()更强大的方法为了让您的快速检索梦想与HashMap一起工作,您需要一种独特的方法来识别 Item 对象 - 我们将以此为关键。对于下面的示例代码,我假设标识符是字符串。您还需要一种方法将物料与数量相关联。我建议不要使用 Object [],而是将 Item 包装在一个新的简单类中,该类同时跟踪项目及其数量。例如:class ItemWrapper {&nbsp; &nbsp; Item item;&nbsp; &nbsp; int quantity;}(我保持了示例的简单性,但您可以根据需要将成员设为私有,添加获取者/设置者等。这样,您的代码就更具可读性,并且需要的强制转换更少。然后,你可以将它与代码一起使用,如下所示:&nbsp; &nbsp; &nbsp; &nbsp; HashMap<String, ItemWrapper> myHashMap = new HashMap<String, ItemWrapper>(1400);&nbsp; &nbsp; &nbsp; &nbsp; public int addItem(Item item, int n) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ItemWrapper wrappedItem = myHashMap.get(item.uniqueID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (wrappedItem == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrappedItem = new ItemWrapper(item, n);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wrappedItem.quantity += n;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myHashMap.put(item.uniqueID, wrappedItem);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public int quantityOf(String itemID) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ItemWrapper wrappedItem = myHashMap.get(itemID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return wrappedItem == null ? 0 : wrappedItem.quantity;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public boolean isInLocker(String itemID) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myHashMap.containsKey(itemID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //or return this.quantityOf(itemID) > 0;&nbsp; &nbsp; &nbsp; &nbsp; }使用数组直接回答您的问题(不是最佳方法)在您的问题中,您询问了大小为 2 的数组。上面的方法是我的建议,但是如果必须使用数组,则可以执行如下代码所示的操作:&nbsp; &nbsp; &nbsp; &nbsp; HashMap<Item, Object[]> myHashMap = new HashMap<Item, Object[]>(1400);&nbsp; &nbsp; &nbsp; &nbsp; public int addItem(Item item, int n) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object[] itemBundle = myHashMap.get(item.uniqueID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (itemBundle == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemBundle = new Object[2];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemBundle[0] = item;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemBundle[1] = new Integer(n);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; itemBundle[2] = new Integer((Integer)itemBundle[2] + n);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myHashMap.put(item.uniqueID, itemBundle);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public int quantityOf(String itemID) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myHashMap.getOrDefault(itemID, 0);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public boolean isInLocker(String itemID) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myHashMap.containsKey(itemID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //or return this.quantityOf(itemID) > 0;&nbsp; &nbsp; &nbsp; &nbsp; }道明你关于测试驱动开发的“额外问题”可能最好作为一个单独的问题来研究。您是否在询问如何在概念上接近TDD,或者如何实际编写用于测试的代码?无论哪种方式,您都可以通过搜索堆栈溢出的现有内容找到很好的答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java