【问题标题】:Program that groups numbers/letters with how many times it iterates, and puts it into array将数字/字母按迭代次数分组并将其放入数组中的程序
【发布时间】:2021-03-01 06:01:01
【问题描述】:

所以我正在尝试编写一个程序来检查一个 Array(Array2) 以查看它是否包含来自另一个 Array(Array1) 的数字,并将它们与它所连接的数字或字母一起分组。使用我在下面放置的数据,我希望它返回类似 (14T,6in,4s,3aegr,2o,1ESTfhlmpx),而不是返回 14T,6i,4s,3a,2o,1e。似乎它不想迭代数组中的所有其他字母和数字。我尝试将它放入一个字符串而不是更改数组以添加具有它的数字,它表明 for 循环遍历了所有字母/数字,但它只是不会将它添加到数组中。我已经被困了几个小时了,只是好奇是否有人可以帮助我解决这个问题。 ????

Array1[0] = "14";
Array1[1] = "6";
Array1[2] = "4";
Array1[3] = "3";
Array1[4] = "2";
Array1[5] = "1";

String[] Array2 = new String[18];
Array2[0] = "E1";
Array2[1] = "S1";
Array2[2] = "T14";
Array2[3] = "a3";
Array2[4] = "e3";
Array2[5] = "f1";
Array2[6] = "g3";
Array2[7] = "h1";
Array2[8] = "i6";
Array2[9] = "l1";
Array2[10] = "m1";
Array2[11] = "n6";
Array2[12] = "o2";
Array2[13] = "p1";
Array2[14] = "r3";
Array2[15] = "s4";
Array2[16] = "t4";
Array2[17] = "x1";
    

for(int a = 0; a < Array1.length; a++){  
   for(int x = 0; x < Array2.length; x++){
       String checkers = Array2[x].substring(1); 
       // ^^ Gets the letter after exp. 
       if(checkers.equals(Array1[a])){
            Array1[a] += Array2[x].substring(0,1);
        }
        else{

          }
        }
    }
    System.out.println(Arrays.toString(Array1));
  }
}

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    这种比较checkers.equals(Array1[a]) 在第一次附加到Array1[a] 后将不成立。要解决这个问题,最好在嵌套循环String num = Array1[a]; 之前提供一个临时变量并与此变量进行比较:

    for (int a = 0; a < Array1.length; a++) {
        String num = Array1[a];
        for (int x = 0; x < Array2.length; x++) {
            String checkers = Array2[x].substring(1);
            if (num.equals(checkers)) {
                Array1[a] += Array2[x].substring(0,1);
            }
        }
    }
    
    System.out.println(Arrays.toString(Array1));
    

    输出:

    [14T, 6in, 4st, 3aegr, 2o, 1ESfhlmpx]
    

    【讨论】:

      【解决方案2】:

      这是因为当您第二次运行 if(checkers.equals(Array1[a])) 以更新 Array1[a] 时(例如“6”的情况),Array1[a] 已经用它的一个字母进行了更新(所以对于“6 ", Array1[a] 变为 "6i"),虽然跳棋可能等于 "6",但 Array[1] 现在等于 "6i"。这就是不断更新Array1[a] 的障碍。为了解决这个问题,您可以创建第三个数组Array3,其中包含Array1 的所有initial 值。这第三个数组将用于与checkers 进行比较。

      if(checkers.equals(Array1[a])) 替换为: if(Array3[a].equals(checkers)).

      【讨论】:

      • 我很想知道这是否对你有帮助,所以如果你能给我一个跟进,那就太棒了:)
      • contains 替换equals 也无济于事,即使不对Array1[a] 附加任何内容——例如"14".contains("1") --&gt; true
      • 您可以创建第三个数组,其中包含与Array1 完全相同的initial 值。您可以使用这第三个数组来执行.equalscheckers
      • 1) 无需创建额外的数组。 2)重点是contains不能用。
      • @AlexRudenko 对于这样的项目,我认为创建第三个数组是一种预期的解决方案,其中空间复杂性不是问题。这样做将消除使用.contains() 的需要。
      【解决方案3】:

      首先,从不在您的对象中使用大写字母。这些只能用于类定义。

      现在来看这个案例。使用正则表达式并创建第二个数组的数组字典。键是数字,值是连接到这些数字的字母。之后,您可以随心所欲地写出此信息:

      import re
      
      match_dict = {}
      
      # Construct the match dict
      for letter_digit in array2:
          # Use regex for string matching
          match_obj = re.match( r'([a-zA-Z]+)([0-9]+)', letter_digit, re.M|re.I)
          letter = match_obj.group(1)
          digit = match_obj.group(2)
          
          if digit in match_dict:
              match_dict[digit].append(letter)
          else:
              match_dict[digit] = [letter]
      
      # Get only letters that match with array1
      array1_matches = {}
      for digit in array1:
          if digit in match_dict:
              array1_matches[digit] = match_dict[digit]
          else:
              # No idea what you want to do if there's no match
              array1_matches[digit] = None
      
      # Print everything
      for key, value in array1_matches.items():
          if value is not None:
              print(key, end='')
              for letter in value:
                  print(letter, end='')
              print(",", end='')
      

      我自己没有测试过代码,但它应该可以满足您的需求。

      【讨论】:

      • 当然,这里我用的是python 3,因为重点是写一个解决问题的程序。相同的核心思想适用于 java,但您使用 HashMaps 而不是字典。此外,for 循环可以重写为 foreach 循环,以减少代码行数并使其更类似于上述语法。正则表达式也适用于 java。
      • 一个未经测试的 Python 解决方案使用正则表达式解决 Java 中的问题看起来有点矫枉过正:)
      • 是的,由于我在工作期间正在编写解决方案,因此我可能不得不快速阅读该问题。无论如何,我认为像这样的逻辑问题没有很大的语言限制,因为它很容易翻译。
      猜你喜欢
      • 2021-01-11
      • 1970-01-01
      • 2020-09-06
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多