【问题标题】:Search string array without a using a loop不使用循环搜索字符串数组
【发布时间】:2012-10-28 19:15:46
【问题描述】:

我有以下数组

String[] arrKey  = new String[] {"A","B","C","D","E",......"Y","Z"};

我想搜索数组并给我字母所在位置的索引。 比如说我想搜索字母“E”,当我搜索数组时,它应该给我“E”的位置,所以我应该得到索引位置 4。我不想在循环中这样做。可能吗?我四处寻找,找不到答案。

【问题讨论】:

  • 如果不想使用显式循环,可以编写递归方法。
  • 不,没有循环是不可能的。
  • 您是否正在寻找一种自包含且不使用循环或任何其他 API 调用的解决方案?

标签: java arrays string search


【解决方案1】:

我不想循环执行此操作。

在您的代码或库代码中必须有一个循环某处

是的,你可以使用

int index = Arrays.asList(arrKey).indexOf("E");

...但这会在幕后循环。

如果你知道你的数组开始排序,你可以使用:

int index = Arrays.binarySearch(arrKey, "E");

这样会更有效率 - 但它仍然是一个循环......

当然,如果你知道你的数组是总是 AZ,那么你可以在没有循环的情况下做到这一点 - 但我假设你的真实情况更笼统.. .

【讨论】:

  • 我对循环的意思是我不想做一个 for 循环。以上可能是我正在寻找的。需要发短信。
  • 感谢 Jon,当我尝试上述方法时:int index = Arrays.asList(arrKey).indexOf("E"); 无论我使用哪个字母,我都会得到 -1 作为答案。当我尝试这个时:int index = Arrays.binarySearch(arrKey, "E"); 我收到此错误:线程“main”中的异常 java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String 我认为它与类型有关数组?
  • @Dino:那么你必须有一个与你展示给我们的数组不同的数组。听起来您真的没有字符串数组。
  • 我实际上使用了 String c = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 然后 char[] arrKey = c.toCharArray(); 和你的代码 int index = Arrays.binarySearch(arrKey, "E"); 为我工作。我不确定它是如何工作的,但从你所说的循环来看?我只是好奇,因为我正在学习 JAVA,因为当您查看该行时,没有循环,只有一行,所以我认为 JAVA(在后台)为该语句执行了自己的循环!对吗?
  • @Dino:是的,所以您的代码与您的问题中的代码不同(您有一个String[])。如果您使用'E' 而不是"E",您的代码应该可以工作。是的,所有这些循环。但是,如果您真的有 A...Z,您可以使用 'E' - 'A'... 如果您能给我们一个准确的印象,这将非常有帮助达到。
【解决方案2】:

如果您必须处理chars 而不是字符串,请查看getNumericValue 方法。

如果您想要更通用的解决方案,您应该考虑使用 Map<String,Integer> 而不是数组。

【讨论】:

    【解决方案3】:

    这基本上是一道面试题,用来测试你的递归技巧,下面是你的做法。

    private static <T> int findIndex(T[] items, T item, int index) {
        if (items.length == index) {
            return -1;
        }
        if (items[index].equals(item)) {
            return index;
        }
        return findIndex(items, item, index+1);
    }
    

    这是你如何运行它

    int val = findIndex(new String[]{"A","B","C"}, "C", 0);
    

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      使用 indexOf

         return arrKey.get(arrKey.indexOf("E"));
      

      【讨论】:

        【解决方案6】:

        只有当你假设你有这个数组(或一个类似的)你可以计算索引时才有可能。

        String s = "E";
        int index = s.charAt(0) - 'E'; // == 4
        

        【讨论】:

          【解决方案7】:

          这是我正在处理的代码。这就是我目前所拥有的。这对我来说只是练习 JAVA 和理解 Ceaser Cipher 的练习轮。

          public class CeaserCipher
          {
          public static void main (String [] args) {
              Scanner keyboard = new Scanner(System.in);
              System.out.println("Enter test letters for Caesar cipher in capitals");
              String input = keyboard.nextLine();
              char[] strArray = input.toCharArray();
          
              System.out.print("What is the key: "); 
              int key = keyboard.nextInt();
              //String[] arrKey  = new String[] {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
              String c  = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
              char[] arrKey = c.toCharArray();
          
              for (int i = 0; i < strArray.length ; i++){
          
                  char cipherValue = strArray[i];
                  int index = Arrays.binarySearch(arrKey, cipherValue);
                  int j = (key + index)%26;
                  System.out.print(arrKey[j]);
          
              }
          }
          }
          

          【讨论】:

          • 尚不清楚您为什么将其添加为答案。这不是基本上承认我的答案有效,尽管使用char 而不是String
          • 哦,我以为你想看看我的回答。我确实尝试过使用 String,但我一直收到错误消息。这就是我转换为 char 的原因。
          • 两者都应该没问题 - 只要您在“阵列中的内容”和“您正在寻找的内容”之间保持一致。因此,您可以在char[] 中查找'E',或在String[] 中查找"E"
          • 啊,非常感谢乔恩,这就是我想学习的。这对我来说真的很清楚。阅读您的最后一条评论让我很高兴得知这两种方法都可以。
          【解决方案8】:

          您可以在这种情况下使用递归:

          let arr = ["A","B","C","D","E","Y","Z"];
          let index = 0;
          
          function find(str){
            if(str[0] === "E")
            { 
              return str[0];
            }
            else {
              str.shift(); 
          

          //从str数组中移除第一个元素并再次调用函数

                  index++;
                  return find(str);
                }
              }
              
              console.log("Found",find(arr));
              console.log("at Index:",index);
              console.log("Peace Out! XD");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-15
            • 1970-01-01
            • 2012-11-09
            • 1970-01-01
            • 2016-05-30
            • 1970-01-01
            • 2015-08-02
            • 2023-03-17
            相关资源
            最近更新 更多