不使用循环查找字符串数组

3

I have the following array

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

我想要在数组中查找字母的位置并返回其索引。 比如我想要查找字母"E",当我搜索这个数组时,它应该给我"E"的位置,所以我应该得到索引位置4。我不想用循环来实现,请问有没有可能?我已经查遍了各种资料,但是找不到答案。


如果您不想使用显式循环,可以编写递归方法。 - Jesper
1
不行,没有循环是不可能的。 - Roman C
你是否正在寻找一个自包含的解决方案,不使用循环或任何其他 API 调用? - Santosh Gokak
8个回答

16

我不想在循环中执行这个操作。

必须有一个循环在某个地方——无论是在你的代码中还是库代码中。

所以,是的,你可以使用

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

...但这将在内部进行循环。

如果您知道您的数组一开始就是排序的,您可以使用:

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

那样会更高效 - 但仍然需要循环...

当然,如果你知道你的数组始终是A-Z,那么你可以在不使用循环的情况下完成它 - 但我假设你的实际情况更为通用化...


我所说的循环是指我不想使用for循环。上面的代码可能就是我要找的。需要测试一下。 - Dino
谢谢Jon,当我尝试使用以下代码时:int index = Arrays.asList(arrKey).indexOf("E");无论我使用哪个字母,我都会得到-1作为答案。当我尝试使用以下代码时:int index = Arrays.binarySearch(arrKey, "E");我得到了这个错误:Exception in thread "main" java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String我猜测这与数组的类型有关? - Dino
@Dino:那你肯定有一个和你展示给我们的不同的数组。听起来你并没有真正拥有一个字符串数组。 - Jon Skeet
我实际上使用了 String c = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 然后 char[] arrKey = c.toCharArray();,你的代码 int index = Arrays.binarySearch(arrKey, "E"); 对我很有用。我不确定它是如何工作的,但从你所说的来看,它会循环?我只是好奇,因为我正在学习JAVA,当你看这行代码时,没有循环,只有一行代码,所以我推断JAVA(在后台)会为该语句执行自己的循环!是这样吗? - Dino
@Dino:没错,你的代码和你在问题中提供的不一样(在那里你有一个String[])。如果你使用'E'而不是"E",你的代码应该可以工作。是的,所有这些都循环。但是如果你真的有A...Z,你可以只使用'E' - 'A'... 如果你能准确地告诉我们你想要实现什么,那会非常有帮助。 - Jon Skeet
Jon,请看我的回复。 - Dino

2

这基本上是一道面试题,用于测试您的递归技巧,以下是如何实现。

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);

1

如果你需要处理 char 而不是字符串,请查看 getNumericValue 方法。

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


0
使用 indexOf
   return arrKey.get(arrKey.indexOf("E"));

0

这是我正在处理的代码。目前这就是我的成果。这只是一个练习,让我练习JAVA并理解凯撒密码。

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 吗? - Jon Skeet
哦,我以为你想看我的答案。我尝试使用String,但一直收到错误提示。这就是我转换为char的原因。 - Dino
无论哪种方式都可以 - 只要在“你的数组中有什么”和“你正在寻找什么”之间保持一致即可。因此,您可以在char []中查找'E',或在String []中查找"E" - Jon Skeet
啊,非常感谢Jon,这正是我想要学习的。这真的为我解决了疑惑。阅读你最后的评论让我很高兴地知道两种方法都可以。 - Dino

0
你可以使用递归来解决这个问题:
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");


0

只有在假设您拥有此数组(或类似的数组)并且可以计算索引时,才可能实现。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接