避免重复没有集?

时间:2014-04-24 14:18:51

标签: java arrays

我是初学者Java课程,在数组中存储值时,我没有机会学习如何避免重复值。

String[] newAlphabet = new String[26];

for(int I = 0; I < newAlphabet.length; I++){

 int random = (65 + (int)(Math.random() * ((90 - 65) + 1));
 char ascii = (char)random;
 String letters = ascii + "";

if(letters != newAlphabet[0] && letters != newAlphabet[1] ... so on and so on until
                                                               newAlphabet[25])
     newAlphabet[I] = letters; 
}//end 

所以这是我的部分程序的伪代码,重点是避免在数组中有重复的字母。

我遇到的问题是在if语句中。而不是键入letters != newAlphabet[]到25,还有另一种方法吗?

我在stackoverflow中看到过一些我应该使用HashSet的论坛,但我还没有学到这些?如果我被允许,我可以问我的老师,但还有另一种方法可以避免这个问题吗?

我一直在考虑使用for-each循环来搜索数组中的所有元素,但如果计划有效,我还没有考虑好这个计划。

5 个答案:

答案 0 :(得分:3)

您可以使用asList方法:

if( Arrays.asList(newAlphabet).contains(letters) ) {
    newAlphabet[I] = letters; 
}

这不是最有效的,但由于你的阵列只有26个元素长,我倾向于明确效率。

一些解释:asListArrays类的静态方法。这只是意味着我们不必创建一个Arrays对象来调用它。我们简单地说Arrays.asList()并将参数传递给它。 asList方法将数组(在本例中为newAlhpabet)作为参数,并从中构建java.util.List。这意味着我们可以在返回值上调用List方法。 contains()List上的一个方法,如果List包含的元素等于参数(在这种情况下为letters),则返回true。

答案 1 :(得分:3)

当你在谈论初学Java类时,我假设你对编程很新。所以,不要只给你一个能为你做的库函数,让我们通过基本代码来完成如何执行此操作的步骤,这样你就可以更好地了解后面发生了什么。场景。

首先,对于任何重复动作,请考虑循环。您想要检查新字母表中的每个字母,如果您要添加的字母与之匹配。所以......

boolean exists = false; //indicates whether we have found a match
for (int j = 0; j < 26; j++) { //for each letter in the new alphabet
    //true if this one, or a previous one is a match
    exists = exists || letters == newAlphabet[i]; 
}
//if we don't have a match, add the new letter
if (!exists) newAlphabet[I] = letters;

现在,当你正在构建新的字母表时,对于大多数运行此代码的情况,我们没有完整的26个字母,所以只检查我们定义的新字母的部分:< / p>

boolean exists = false; 
for (int j = 0; j < I; j++) { //note in this line we stop before the insertion point
    exists = exists || letters == newAlphabet[i]; 
}
if (!exists) newAlphabet[I] = letters;

最后,我们不需要继续检查我们是否已找到匹配项,因此我们可以在找到匹配项时将循环更改为停止:

boolean exists = false;
int j = 0;
while (!exists && j < I) { //we now also stop if we have already found a match
    exists = letters == newAlphabet[i]; 
    //as we are stopping at the first match, 
    //we no longer need to allow for previous matches
}
if (!exists) newAlphabet[I] = letters;

答案 2 :(得分:2)

根据这一行,看起来您要做的就是以其他顺序生成AZ的字母:

int random = (65 + (int)(Math.random() * ((90 - 65) + 1));

如果我理解正确,那么你真正要做的就是 shuffle 字母表:

// Initialize new alphabet array
String originalAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] newAlphabet = originalAlphabet.toCharArray();
// Shuffle the new alphabet by swapping each character to a random position
for (int i=0; i<26; i++) {
  int j = (int)(Math.random() * 26);
  char temp = newAlphabet[i];
  newAlphabet[i] = newAlphabet[j];
  newAlphabet[j] = temp;
}
// Print the new alphabet
for (int i=0; i<26; i++) {
  System.out.print(newAlphabet[i]);
}
System.out.println();

以下是示例输出:VYMTBIPWHKZNGUCDLRAQFSOEJX

答案 3 :(得分:0)

你有两个选择。

  1. 循环播放数组并基本完成您现在正在做的事情。

  2. 按排序顺序插入字符,以便执行二进制搜索以确定列表中是否已有字母。作为奖励,如果您使用选项2,您已经知道插入点。

  3. 查看Arrays.binarySearch():http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

答案 4 :(得分:-3)

你可以用这个:

if(Arrays.binarySearch(newAlphabet, letters) < 0){
  newAlphabet[I] = letters;
 }

您应该包含一个while循环,以确保在移动到下一个数组之前填充数组的每个索引,或者您可以使用Arrays.binarySearch的返回值(-(insertion index) - 1)填充数组并在数组填满时退出。