【问题标题】:Searching array搜索数组
【发布时间】:2012-12-08 05:16:50
【问题描述】:

我试图弄清楚如何创建一种方法来在数组中查找字符串并将该字符串及其索引打印出来。我认为方法签名是正确的,但我不知道如何在方法中返回字符串值。

String name = search(array,"Dog"); //the method implementation in main
System.out.println(name);

.

public static int search(String[] array, String key)
{
    for (int i= 0; i< array.length; i++)
        {
         if ( array[i] == key ) 
         return i;  
        }
     return ("Name cannot be found in array);
}

【问题讨论】:

  • 嗯。为什么你的返回类型是int,如果你想首先返回String
  • 如果未找到元素,则返回 -1 而不是 String。这是标准做法。

标签: java search


【解决方案1】:

您不能从声明为返回int 的方法返回String。指示失败的最常见方法是返回超出范围的值:

return -1;

或者抛出异常:

throw new NameNotFoundException("Name cannot be found in array");

另外,这条线也行不通:

if ( array[i] == key ) 

字符串必须是compared with equals(), not ==== 运算符检查字符串是否相同对象,而不是它们的内容相同。

if (key == null && array[i] == null ||
    key != null && key.equals(array[i]))

并确保不要在空引用上调用.equals()。上面的代码检查了这种可能性。

【讨论】:

  • 好吧,我在 OP 代码中看到至少 3 个问题。也许你可以解决所有这些问题。
  • 我修复了......显然愚蠢的错误......然后我有一个顿悟并使用布尔值将其变成一个循环。现在效果很好 XD 感谢大家的帮助
【解决方案2】:

为什么要返回字符串?调用此方法的人已经知道 String 是什么,因为他们必须首先提供它。 (否则怎么知道你在找什么:P)

你也应该这样做array[i].equals(key)

== 用于对象相等。 .equals() 是为了价值平等。

【讨论】:

    【解决方案3】:

    如果你想返回一个String,那么……你的返回类型应该是String,而不是int

    此外,您不应将==Strings 一起使用,或者与大多数对象一起使用array[i].equals(key)

    【讨论】:

      【解决方案4】:

      最大的问题是为什么 java 已经为你实现了搜索?

       String[] array;
       String val = "Dog";
      
       if( Arrays.asList(array).contains(val) ){
            System.out.println("your string is found");
       } else {
            System.out.println("your string is found");
       }
      

      或者更好更真实的实现

       String[] array;
       String val = "Dog";
       String name = ( Arrays.asList(array).contains(val) ) ? val : "Name cannot be found in array";
      

      应该注意 Arrays.asList 不复制数组只是将其包装在 List 结构中,以便可以将其视为可枚举。此方法的性能与您提供的方法大致相同。

      【讨论】:

      • 所以你从一个数组中创建了一个list,只是为了找出它是否包含一个值?谈低效的代码……
      • 实际上 Arrays.asList 的性能非常好,因为没有执行数据复制,它仅返回已经存在的 String[] 的列表视图。两种方法都在 O(n) 中运行,并且缩放相同。没有理由避免这种方法。 -- 在你在这里怀疑我之前学习你的 java....
      • 更多信息请看这里stackoverflow.com/questions/1552783/…
      • 确实复杂度保持不变,创建列表本身是O(1),但我真的认为创建indexOf() 方法是更好的解决方案。它更干净、更快,并且不会为 GC 留下任何垃圾 - 我已经看到应用程序因为像这样不必要的对象创建而减速到停止......
      • 它是一个匿名对象...它立即被收割。事实是,现实中的解决方案几乎完全相同。只有一个更容易阅读和清洁。
      【解决方案5】:

      您已经拥有正在搜索的字符串值。为什么需要退货? 只需返回索引

      int index = search(array,"Dog");
      

      【讨论】:

        【解决方案6】:

        首先修复您的比较以使用equals 方法:

          if (array[i].equals(key)) 
        

        还将最后一个返回语句更改为:

          return -1; //string not found
        

        然后简单地执行此操作(使用 array[searchIndex] 获取字符串):

        int searchIndex = search(array,"Dog");
        if(i >= 0){
          System.out.println("String="+array[searchIndex] + ", Array Index="+searchIndex);
         }else{
           System.out.println("String not found");
         }
        

        【讨论】:

          【解决方案7】:

          你可以试试这个.....

          import java.util.*;  
          public class xyz {  
           public static void main(String [] args){  
              String [] sa = {"abc","def","ghi"};  
              Arrays.asList(sa);  
              Arrays.sort(sa);  
              for(String s : sa){  
                  System.out.println(s);  
              }  
          }  
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-16
            • 2011-09-12
            • 2015-07-02
            • 2018-08-31
            • 2014-12-02
            • 2015-03-19
            • 1970-01-01
            相关资源
            最近更新 更多