0

例子:

 wordsUsed[0][0] = "Word 1";
 wordsUsed[0][1] = "0";
 wordsUsed[1][0] = "Word 2";
 wordsUsed[1][1] = "0";

 String wordsCopy[][] = new String[2][2]

我想要的是 wordsCopy[][] 包含“Word 1”2 次和“Word 2”也 2 次。我不想要的是“Word 1”的随机次数和“Word 2”的随机次数

wordsUsed[x][0] 

^ 是一个包含单词的字符串 // x 表示“任何值”

wordsUsed[x][1] 

^是标准的“0”

wordsCopy[][] 

^ 是一个新数组,它将在 kleurGebruikt[x][0] 中存储每个字符串的 2 个

基本上我想要完成的是来自 [x][0] 的相同字符串在新数组中存储的次数永远不会超过 2 次

到目前为止我得到的是它会检查计数器,如果它是 0,它将复制字符串,然后将 0 更改为 1。如果稍后它得到相同的字符串,它将看到它已经使用过一次并复制它再一次。现在我的问题是,当它被复制两次时,我不确定如何让它跳过这个字符串并尝试不同的字符串。任何帮助表示赞赏

public void randomWords() {
    Random r = new Random();
    int rndm = 0;

    for(int i=0; i<4; i++){
        for(int j=0; j<5; j++){
            rndm = r.nextInt(wordsUsed.length);
            if (wordsUsed[rndm][1].equals("0")){
                wordsCopy[i][j] = wordsUsed[rndm][0];
                wordsUsed[rndm][1] = "1";
            }

            else if (wordsUsed[rndm][1].equals("1")){
                wordsCopy[i][j] = wordsUsed[rndm][0];
                wordsUsed[rndm][1] = "2";
            }                

            else if (wordsUsed[rndm][1].equals("2")){
                 // at this point I need to go back to the start of the current 
                 // if loop and make it so that a new random string is searched for
                 // without leaving a null element in the array.
            }  
}

顺便说一句,如果标题不是很好,我很抱歉。我真的不知道如何用几句话来解释自己

谢谢

4

2 回答 2

1

使用 equals 比较字符串。所以,而不是——

if (kleurGebruikt[rndm][1] == "0"){
    ...
}

应该-

if("0".equals(kleurGebruikt[rndm][1])){
    ...
}

编辑:

由于这些变量名称和设计,我很难理解您的代码。这是您可以做到的一种方法。如果我是你,我不会使用数组来完成这项任务——

Random r = new Random();
int rndm = 0;

String[][] wordsUsed = new String[2][2];
wordsUsed[0][0] = "Word 1";
wordsUsed[0][1] = "0";
wordsUsed[1][0] = "Word 2";
wordsUsed[1][1] = "0";

String wordsCopy[][] = new String[2][2];

int ctrR = 0;
int ctrC = 0;
boolean isDone = false;

while(!isDone) {

    rndm = r.nextInt(wordsUsed.length);

    if (wordsUsed[rndm][1].equalsIgnoreCase("0") 
            || wordsUsed[rndm][1].equalsIgnoreCase("1")){

        if (wordsUsed[rndm][1].equalsIgnoreCase("0")){
            wordsCopy[ctrR][ctrC] = wordsUsed[rndm][0];
            wordsUsed[rndm][1] = "1";
        } else {
            wordsCopy[ctrR][ctrC] = wordsUsed[rndm][0];
            wordsUsed[rndm][1] = "2";
        }     

        if(ctrC == wordsCopy.length - 1){
            ctrR++;
            ctrC = 0;
        } else { 
            ctrC++;
        }
    }

    if(ctrR == wordsCopy.length){
         // If ctrR reached the length, we have successfully completed copying
        isDone = true;
    }    
}           


///////////////// RESULTS /////////////////

// Values of wordsUsed array
for(int i = 0; i < wordsUsed.length; i++){
    for(int j = 0; j < wordsUsed.length; j++){
        System.out.print(wordsUsed[i][j] + "\t");

    }
}

System.out.println("\n");

// Values of wordsCopy array    
for(int i = 0; i < wordsCopy.length; i++){
    for(int j = 0; j < wordsCopy.length; j++){
        System.out.print(wordsCopy[i][j] + "\t");

    }
}
于 2013-08-25T17:14:11.990 回答
1

如果我理解正确,我认为如果您使用Map. 作为键,您存储单词 ( "Word1", "Word2", 等等...) 并作为值存储次数。例如(Java 7):

final Map<String, Integer> wordsUsed = new HashMap<>();
// Put word
final String curUsed = wordsUsed.get(wordToPut);
if (curUsed == null) {  // New word, put counter to 1
    wordsUsed.put(wordToPut, 1);
} else { // Old word, increase previous counter
    wordsUsed.put(wordToPut, ++curUsed);
}

如果要保留插入顺序,可以使用 aLinkedHashMap代替。

附带说明一下,Java 中的数组很少能解决您的问题。JDK 数据结构几乎总是提供更好更快(代码编写)的解决方案。

于 2013-08-25T17:57:42.953 回答