如何做一个空数组

How to do an empty array

提问人:Danny Thompson 提问时间:2/17/2023 最后编辑:cyberbrainDanny Thompson 更新时间:2/17/2023 访问量:139

问:

我这里有这个问题

一旦玩家从牌组中抽出最上面的牌,他们就必须丢弃它。

给定一副牌,返回一副新牌,其中包含除原始牌组中的第一张牌之外的所有牌。

注意:返回的新数组比原始数组短一个元素,除非牌组没有牌。则返回的数组必须为空。

所以基本上我必须创建一个与旧数组相同的新数组减去索引 0 处的卡。我遇到的问题是当我必须放置一个空数组并且 IntelliJ 不断抛出 NegativeArraySizeException 时。

public String[] discardTopCard(String[] remainingDeck) {
    String[] newHand = new String[remainingDeck.length - 1];
    String[] emptyArray = new String[] {};
    int k = 0;

    if (remainingDeck.length == 0 || remainingDeck.length == 1) {
        return emptyArray;
    }
    for (int i = 1; i < remainingDeck.length; i++) {
        newHand[k] = remainingDeck[i];
        k++;
    }
    return newHand;
}    

这是我当前的代码。

我也试过了这个,只是将其设置为空

public String[] discardTopCard(String[] remainingDeck) {
    String[] newHand = new String[remainingDeck.length - 1];
    int k = 0;

    if (remainingDeck.length == 0 || remainingDeck.length == 1) {
        return remainingDeck;
    }
    for (int i = 1; i < remainingDeck.length; i++) {
        newHand[k] = remainingDeck[i];
        k++;
    }
    return newHand;
}    
Java 数组 异常

评论

1赞 Rogue 2/17/2023
您应该查看 and 其他集合,因为它们不像数组那样是固定大小的。ArrayList
1赞 Scott Hunter 2/17/2023
在你知道你需要之前,不要创建。newHand
0赞 Scott Hunter 2/17/2023
第二个版本不会无法删除最后一张卡吗?并且在尝试从空牌组中移除物品时遇到同样的问题?
1赞 Donat 2/17/2023
您应该在块之后创建新的。此时,您知道长度大于 1。否则,您将尝试创建一个长度为 -1 的。这将是非法的,ArrayifArray
1赞 cyberbrain 2/17/2023
你能添加异常堆栈跟踪吗?

答:

0赞 cyberbrain 2/17/2023 #1

如果您想使用仅是现有 on 一部分的新数组,我建议使用现有方法:java.util.Arrays.copyOfRange

例:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

public String[] discardTopCard(String[] remainingDeck) {
    int length = remainingDeck.length;
    if (length < 2) {
        return EMPTY_STRING_ARRAY;
    }
    
    return Arrays.copyOfRange(remainingDeck, 1, length);
}    

我在方法外部将空字符串数组声明为常量,因为它是不可变的,并且没有必要在整个程序中创建多个实例。

在这两种情况下,空输入数组和长度为 1 的输入数组将产生相同的结果:空数组。

另请注意,在方法中使用 of 是可以的,因为它充当“to”索引,而不是要复制的元素数。lengthcopyOfRange

0赞 Philippe Fery 2/17/2023 #2

或者,更简单:

public String[] discardTopCard(String[] deck) {
    if (deck.length > 1) 
        deck = Arrays.copyOfRange(deck, 1, deck.length);
    return deck;
}

评论

0赞 Old Dog Programmer 2/17/2023
如果?deck.length == 1
0赞 Philippe Fery 2/17/2023
public String[] discardTopCard(String[] deck) { if (deck.length > 0) deck = Arrays.copyOfRange(deck, 1, deck.length);
0赞 Philippe Fery 2/17/2023
你是对的;-)
0赞 Adriaan Koster 2/17/2023 #3

这个怎么样?

public String[] discardTopCard(String[] deck) {

    if (deck.length == 0) {
        return deck;
    }

    String[] smallerDeck = new String[deck.length - 1];
    for (int i = 0; i < smallerDeck.length; i++) {
        smallerDeck[i] = deck[i];
    }

    return smallerDeck;
}