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

我是一名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 
String[]newAlphabet=新字符串[26];
for(int I=0;I
这是我的部分程序的伪代码,它的目的是避免数组中有重复的字母

我遇到的问题是在if语句中。除了键入
字母!=newAlphabet[]
到25之外,还有其他方法吗

我在stackedoverflow中看到了一些论坛,我应该使用
HashSet
,但我还没有学会。如果允许的话,我可以问我的老师,但有没有其他方法可以避免这个问题


我一直在考虑使用for each循环来搜索数组中的所有元素,但如果该计划有效,我还没有考虑足够长的时间。

您有几个选项

  • 在数组中循环,基本上执行您现在正在执行的操作

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

  • 签出Arrays.binarySearch():

    您可以使用以下方法:

    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