自动为数组赋值

时间:2013-08-25 17:01:22

标签: java arrays

示例:

 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.
            }  
}
是的,如果标题不是很好,我很抱歉。我不太确定如何用几句话解释自己

由于

2 个答案:

答案 0 :(得分: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");

    }
}

答案 1 :(得分: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);
}

如果您想保留广告订单,可以使用LinkedHashMap代替。

作为旁注,Java中的数组很少能解决您的问题。 JDK数据结构几乎总能提供更好,更快(代码编写)的解决方案。