示例:
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.
}
}
是的,如果标题不是很好,我很抱歉。我不太确定如何用几句话解释自己
由于
答案 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数据结构几乎总能提供更好,更快(代码编写)的解决方案。