Java 避免没有集合的重复?
我是一名Java初学者,还没有机会学习如何在数组中存储值时避免重复值Java 避免没有集合的重复?,java,arrays,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(lett
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
String[]newAlphabet=新字符串[26];
for(int I=0;I
这是我的部分程序的伪代码,它的目的是避免数组中有重复的字母
我遇到的问题是在if语句中。除了键入字母!=newAlphabet[]
到25之外,还有其他方法吗
我在stackedoverflow中看到了一些论坛,我应该使用HashSet
,但我还没有学会。如果允许的话,我可以问我的老师,但有没有其他方法可以避免这个问题
我一直在考虑使用for each循环来搜索数组中的所有元素,但如果该计划有效,我还没有考虑足够长的时间。您有几个选项
if(Arrays.binarySearch(newAlphabet, letters) < 0){
newAlphabet[I] = letters;
}
if(Arrays.binarySearch(新字母表,字母)<0){
新字母表[I]=字母;
}
您应该包括
while
循环,以确保在移动到下一个数组之前填充数组的每个索引,或者可以使用数组的返回值。binarySearch
即((插入索引)-1)
填充数组并在数组填充完毕后退出。您可以使用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.当您谈论一个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;
boolean exists=false;//指示是否找到匹配项
对于(int j=0;j<26;j++){//对于新字母表中的每个字母
//如果此项或上一项匹配,则为true
exists=exists | |字母==新字母表[i];
}
//如果没有匹配项,请添加新字母
如果(!exists)newAlphabet[I]=字母;
现在,当您在构建新的字母表时,对于大多数运行此代码的情况,我们没有完整的26个字母,因此只检查我们定义的新字母表的部分:
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;j
最后,我们不需要一直检查是否已经找到匹配项,因此我们可以在找到匹配项时将循环更改为停止:
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;
boolean exists=false;
int j=0;
虽然(!exists&&j
基于这一行,看起来您所要做的就是按照其他顺序生成字母A
到Z
:
int random = (65 + (int)(Math.random() * ((90 - 65) + 1));
如果我理解正确的话,那么实际上你所要做的就是重新排列字母表:
// 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();
//初始化新的字母表数组
字符串originalAlphabet=“abcdefghijklmnopqrstuvxyz”;
char[]newAlphabet=originalAlphabet.toCharArray();
//通过将每个字符交换到随机位置来洗牌新字母表
对于(int i=0;i您可以将值添加到集合中,然后将它们全部添加到数组中。重复的值不会添加到集合中。如果您不想使用Set/HashSet,当然,如果数组中已经包含字母,您可以始终在数组中进行搜索,但这将需要大量额外的测试,因此对于大量的单词,运行时非常缓慢你为什么不想使用集合?我还没有学会使用集合,等我很快见到我的老师时,我会问她。你有几个选择。1-循环数组,基本上做你现在正在做的事情。2-按排序顺序插入字符,这样你就可以执行二进制搜索,以确定列表中是否已经有字母。作为奖励,如果你如果使用选项2,您将已经知道插入点。保持数组排序将涉及大量复制。我认为建议使用集合然后将其转换为数组的注释将更有效,并且需要les