码:
import java.util.*;
public class shuffleDeck
{
public static int shuffleDeck (int[] deck, int theNumber)
{
int [] array1 = new int [52];
Random random = new Random();
for (int i = deck.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = deck[i - 1];
deck[i - 1] = deck[j];
deck[j] = tmp;
return theNumber;
}
}
public static void main(String[] args)
{
int [] deck = new int [52];
for(int i=0; i<52; i++)
{
deck[i]=i+1;
}
int count;
count=1;
int total=1;
shuffleDeck(deck, count);
System.out.println();
}
}
shuffleDeck方法出错。 我不确定我需要返回什么内容,但是它不会返回,这是我遇到的奇怪错误。
我无法解决这个问题,我遍及整个堆栈。
谢谢任何可以帮助我解决此错误的人。
类名和方法名不能相同。 它成为一个构造函数。
如果在循环的第一次迭代中从方法返回,为什么会有一个循环? 如果只返回您给定的值,而未修改,为什么还要有任何代码? 到那时候...为什么还要退货? 调用代码已经具有该值。
您还返回了theNumber参数的未更改值,这是故意的吗? 那也与您的问题有关:theNumber是普通的int,而不是int[],因此它与您声明的int[]返回类型不兼容。
请遵守Java命名约定(oracle.com/technetwork/java/codeconventions-135099.html)。 这样可以避免您的错误
在Java上,当您定义一个方法时,该方法必须必须返回一个值,或者必须使用void关键字声明。
public static int shuffleDeck(int[] deck);
意味着,您将使用return关键字返回原始整数(int)。
public static int shuffleDeck(int[] deck);
意味着,您将不返回任何东西,因此在这里使用void进行声明。
最后,我认为这是您要实现的目标,所提供的代码中存在一些问题,可能是您可以浏览下面的示例;
import java.util.Random;
public class Test1 {
public static void shuffleDeck(int[] deck) {
int[] array1 = new int[52];
Random random = new Random();
for (int i = deck.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = deck[i - 1];
deck[i - 1] = deck[j];
deck[j] = tmp;
}
}
public static void main(String[] args) {
int[] deck = new int[52];
for (int i = 0; i < deck.length; i++) {
deck[i] = i + 1;
}
System.out.println("Initial Ordered Deck");
printDeck(deck);
int count;
count = 1;
int total = 1;
shuffleDeck(deck);
System.out.println("Shuffled Deck");
printDeck(deck);
}
private static void printDeck(int[] deck) {
System.out.println("**************************************");
for (int i = 0; i < deck.length; i++) {
if (i % 13 == 0 && i > 0 )
System.out.println();
System.out.printf("%2d", deck[i]);
}
System.out.println("
**************************************");
System.out.println();
}
}
输出是;
Initial Ordered Deck
**************************************
1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 18 19 20 21 22 23 24 25 26
27 28 29 30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49 50 51 52
**************************************
Shuffled Deck
**************************************
22 6 13 11 35 23 29 27 8 30 44 20 1
31 34 28 47 5 46 17 51 38 3 19 36 18
42 33 7 4 2 24 41 9 15 45 21 16 37
14 48 43 49 32 12 40 39 26 50 52 10 25
**************************************
更改
public static int shuffleDeck (int[] deck, int theNumber)
至
public static void shuffleDeck (int[] deck, int theNumber)
如果定义return type,则必须提供一个。
void定义不需要返回类型。
在这种情况下,请删除:
return theNumber;
在shuffleDeck方法中。
theNumber完全不变。 我认为那不是OP想要的。 将返回类型更改为void应该是答案。
是? 那是我的答案
编辑好之前先回答。
我想基于您的主要方法,您想要的是在给定的count时间内洗牌,因为您应该按以下方式更新方法:
public static void shuffleDeck (int[] deck, int theNumber)
{
Random random = new Random();
for (int k=0; k < theNumber; k++) {
for (int i = deck.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = deck[i - 1];
deck[i - 1] = deck[j];
deck[j] = tmp;
}
}
}
根据您的输入,返回您实际执行洗牌的次数是没有意义的。在https://stackoverflow.com/a/30757452/4234940中发布的内部循环只是随机播放本身,所以实际上我会像这样更改它:
public static void shuffleDeck (int[] deck, int theNumber)
{
Random random = new Random();
for (int k=0; k < theNumber; k++) {
shuffle(deck, random);
}
}
private static void shuffle(int[] array, Random random){
for (int i = array.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = array[i - 1];
array[i - 1] = array[j];
array[j] = tmp;
}
}
用大写的类名来区分类和方法:
public class ShuffleDeck {
...
也许最好重命名该方法:
public static int doTheShuffle(int[] deck, int theNumber) {
如果您希望函数返回明智的结果,请将返回值置于循环之外:
for (int i = deck.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = deck[i - 1];
deck[i - 1] = deck[j];
deck[j] = tmp;
}
return theNumber;
但这一切只会使编译器不会抱怨语法错误。您的算法仍然存在错误。
这是因为您已将return类型声明为int,并且在for循环中提供了return语句,现在想想如果您的代码不进入for循环会发生什么,而不会有return语句,那么会发生什么,
所以让你的代码像
public static int shuffleDeck (int[] deck, int theNumber)
{
int [] array1 = new int [52];
Random random = new Random();
for (int i = deck.length, j, tmp; i > 1; i--) {
j = random.nextInt(i);
tmp = deck[i - 1];
deck[i - 1] = deck[j];
deck[j] = tmp;
return theNumber;
}
return 0;
}