gpt4 book ai didi

java - 数据结构 - 用 Ja​​va 创建 Bag

转载 作者:行者123 更新时间:2023-12-02 04:59:22 25 4
gpt4 key购买 nike

我正在为我的 CS 类(class)中的二十一点游戏制作一袋纸牌。这个特定的项目要求我创建一个袋子来容纳我的 52 张卡片。请记住,我试图确保每张牌都有 4 种类型,即 Q、K、J 和 A。我的 main 中不断出现错误: Exception in thread "main"java.lang.ClassCastException: [Ljava.lang.Object;无法转换为 [Ljava.lang.Integer; 在Main.main(Main.java:14)

如果有人可以帮助我让这个包正常运行,我将不胜感激。

这是我的代码:

public class Bag<T> 
{
T[] cards;
private final int DEFAULT_CAPACITY = 52;
private int numberOfEntries;

public Bag()
{
this.cards = (T[]) new Object[DEFAULT_CAPACITY];
numberOfEntries = DEFAULT_CAPACITY;
}

public int getCurrentSize()
{
return numberOfEntries;
}

public boolean isFull()
{
return numberOfEntries == DEFAULT_CAPACITY;
}

public boolean isEmpty()
{
return numberOfEntries == 0;
}

public boolean add(T newItem)
{
boolean result = true;
if(isFull())
{
result = false;
}

else
{
cards[numberOfEntries] = newItem;
numberOfEntries++;
}

return result;
}

public boolean remove()
{
boolean result = true;
if(numberOfEntries > 0)
{
numberOfEntries--;
}
else
result = false;

return result;
}

public void clear()
{
numberOfEntries = 0;
}

public int getNumOf(T anItem)
{
int count = 0;

for(int i = 0; i < cards.length; i++)
{
if(anItem.equals(cards[i]))
{
count++;
}
}

return count;
}

public boolean contains(T anItem)
{
boolean found = false;

for (int i = 0; !found && (i < numberOfEntries); i++)
{
if(anItem.equals(cards[i]))
{
found = true;
}
}

return found;
}

public T Grab()
{
int random = (int)(Math.random() * DEFAULT_CAPACITY);
if(!isEmpty())
{
cards[random] = null;
numberOfEntries--;
return cards[random];
}

else
return null;
}

public int getFrequencyOf(T anItem)
{
int counter = 0;

for(int i = 0; i < numberOfEntries; i++)
{
if(anItem.equals(cards[i]))
{
counter++;
}
}

return counter;
}

}

public class Main {

public static void main(String[] args)
{
//Accesses the Bag class
Bag<Integer> bag = new Bag<Integer>();

//Sets up 52 cards (13*4). 4 of each type
for (int i = 1; i <= 13; i++)
{

for (int j = 1; j <= 4; j++) {
bag.cards[i*j] = i;
//if the card is an ace and not equal to 1
if(i == 1)
bag.cards[i*j] = 11;
//handles the king, queen, and jack cards
else if (i==11||i==12||i==13)
bag.cards[i*j] = 10;
}

bag.add(1);
}
}
}

最佳答案

不要提供对 T[] 卡 变量的访问权限。将其设置为私有(private),并在您的Bag中创建一个set方法,如下所示:

public void set(int index, T item) {
// assume !full AND 0 <= index < cards.length
this.cards[index] = item;
}

然后,不要这样做:

bag.cards[i*j] = 10;

然后你会这样做:

bag.set(i*j, 10);    

您收到类转换异常的事实是因为类型删除:您的 T[] 仅在编译时存在。编译后,它就变成了一个Object[]。这就是为什么您的直接访问cards[0] = 123会抛出此异常(整数123不能放入Object[]内)。

我建议的 set(int index, T value) 有效,因为编译后,它将变成 set(int index, Object value),因此:没有类转换异常。

编辑

您可以测试以下快速演示:

class Bag<T> {

private T[] cards;

public Bag() {
this.cards = (T[]) new Object[10];
}

public void set(int index, T value) {
this.cards[index] = value;
}

@Override
public String toString() {
return "Bag{cards=" + java.util.Arrays.toString(cards) + "}";
}

public static void main(String[] args) {
Bag<Integer> bag = new Bag<Integer>();
bag.set(0, 10);
bag.set(1, 20);
bag.set(2, 30);
System.out.println(bag);
}
}

关于Ideone ,这将打印:

Bag{cards=[10, 20, 30, null, null, null, null, null, null, null]} 

您还可以简单地从 cards 变量中删除泛型,如下所示:

class Bag<T> {

private Object[] cards;

public Bag() {
this.cards = new Object[10];
}

public void set(int index, T value) {
this.cards[index] = value;
}
}

为了获得灵感,您可以随时查看与您自己的类相似的核心 Java 类的源代码。在本例中,这将是 java.util.ArrayList:http://www.docjar.com/html/api/java/util/ArrayList.java.html

关于java - 数据结构 - 用 Ja​​va 创建 Bag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28442310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com