【问题标题】:Searching multi-dimensional arrays for a String在多维数组中搜索字符串
【发布时间】:2011-03-02 17:57:00
【问题描述】:

我有一个包含 String、double 和 float 类型的数组,我需要能够在其中搜索 String。我尝试进行二进制搜索,但在运行程序并尝试搜索时出现以下错误:

java.lang.ClassCastException: java.lang.String cannot be cast to Customer
    at Customer.compareTo(prog4.java:1)
    at java.util.Arrays.binarySearch0(Unknown Source)
    at java.util.Arrays.binarySearch(Unknown Source)
    at prog4.main(prog4.java:59)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

我还没有找到任何其他搜索 3d 数组的方法,因此我们将不胜感激。

这是我的代码:

case 'b':
      System.out.println();
      System.out.println("Please enter a customer name:");

      String search = kb.nextLine(); //read the user's search
      int place; //location of result

      Arrays.sort(A);

      place = Arrays.binarySearch(A, search);

      if (place <= 0)
        System.out.println("Cannot find customer named " + search);
     else
     {
       System.out.println("Customer found:");  
       System.out.println(A[place]);
     }

            break;

【问题讨论】:

  • 某处 - 您正在转换为 Customer,而您应该将其转换为 String

标签: java arrays search


【解决方案1】:

与其使用数组,不如使用 Map()

Customer myCust = customers.get(search);

另一种选择是创建一个新客户

Customer searchCust = new Customer(search);

place = Arrays.binarySearch(A,searchCust);

要正确找到客户,您需要实现 Comparable 接口:

                                 // add this
public class Customer implements Comparable<Customer> {

    // add this guy
    public int compareTo(Customer other) {
        return this.name.compareTo(other.name); // I'm assuming 'name' is the variable of the name
    }

}

或者您可以使用在@spinttheblack 的帖子中定义的比较器。

【讨论】:

  • 我必须使用一个数组。这是我的 Java 课程的作业。 :/不过,我会尝试建立一个新客户。谢谢。
  • 我想了很多,这就是为什么我在那里放了两个选项。请记住,您需要覆盖 Customer 中的 public boolean equals(Object o) 方法才能使其正常工作。否则它会做一个参考比较,它不会起作用。
  • @glowcoder - 我认为如果 OP 想要使用二进制搜索,他需要覆盖可比较的接口(编辑)nm,看起来你解决了这个问题......
  • @spint 好点,spint - 将其更改为 Comparable 界面,如果 OP 无法控制它,则指向您的帖子。
  • 我的程序中没有公共布尔等于(对象)类。据我所知,它不是必需的,而且教授在 shell 程序中没有它。
【解决方案2】:

看起来您正在传入一个 Customer 数组并搜索一个字符串。

除了 gloomcoder 的解决方案(创建一个虚拟客户)之外,您可能还需要覆盖 Customer 的 compareTo 方法。即,

class Customer{
     compareTo(Object o1, Object o2){
            return ((Customer)o1).getStringField().compareTo(((Customer)o2).getStringField())
     }
}

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2013-11-05
    相关资源
    最近更新 更多