我是初学者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循环来搜索数组中的所有元素,但如果计划有效,我还没有考虑好这个计划。
答案 0 :(得分:3)
您可以使用asList
方法:
if( Arrays.asList(newAlphabet).contains(letters) ) {
newAlphabet[I] = letters;
}
这不是最有效的,但由于你的阵列只有26个元素长,我倾向于明确效率。
一些解释:asList
是Arrays
类的静态方法。这只是意味着我们不必创建一个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)
根据这一行,看起来您要做的就是以其他顺序生成A
到Z
的字母:
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)
你有两个选择。
循环播放数组并基本完成您现在正在做的事情。
按排序顺序插入字符,以便执行二进制搜索以确定列表中是否已有字母。作为奖励,如果您使用选项2,您已经知道插入点。
查看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)
填充数组并在数组填满时退出。