在java中使用自定义比较器搜索数组

无论strToSearch变量保持什么,为什么总是返回49999 ? 即使使用clank搜索变量,它也会返回相同的值。 我错过了什么:

  String[] arr = new String[100000]; String strToSearch = "12"; for (int i = 0; i < arr.length; i++) { arr[i] = i+","+i; } Arrays.sort(arr, new Comparator() { @Override public int compare(String o1, String o2) { if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1 && o2.indexOf(",") != -1) { String[] o1Arr = o1.split(","); String[] o2Arr = o2.split(","); Integer one = Integer.parseInt(o1Arr[0]); Integer two = Integer.parseInt(o2Arr[0]); return one.compareTo(two); } return 0; } }); System.out.println(Arrays.binarySearch(arr, strToSearch, new Comparator() { @Override public int compare(String o1, String o2) { if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1 && o2.indexOf(",") != -1) { String[] o1Arr = o1.split(","); String[] o2Arr = o2.split(","); return o1Arr[0].compareTo(o2Arr[0]); } return 0; } })); 

我的数组包含逗号分隔值,我想在数组元素中的逗号之前基于字符串进行搜索。 还有其他简单的解决方案吗? 我也做了一个自定义方法循环数组并找到字符串,但我正在寻找一些替代方案。

Arrays.binarySearch(...)上的JavaDoc声明数组必须已经排序,因此比较器实际上比较了数组值和搜索字符串,而不是用于再次对数组进行排序。

这意味着你得到像compare(arr[x], "12")和if条件声明两个字符串必须包含逗号,否则它们是相等的。 并且"12"不包含任何逗号,因此使"12"等于数组中的每个元素(始终返回0)。

编辑

查看源代码似乎支持我的假设。 就是这一行,例如:

  //c is the Comparator //midVal is an element of your array //key is the key parameter you passed to binarySearch(...) c.compare(midVal, key); 

返回49999的原因是第一个mid值在索引mid = (low + high) >> 1 ,即(0 + 99999) >> 1 == 49999并且由于比较器返回0,因此认为这些值相等。 繁荣,价值是“发现”。

在你的第二个if语句中:因为你的strToSearch = "12"并且不包含"," ,所以

 o2.indexOf(",") != -1 

总是会返回false

if -Statement或至少最后一部分删除了孔,它就可以了。

问题出在二进制搜索的比较器方法中。 它应该像这样重写:

 System.out.println(Arrays.binarySearch(arr, strToSearch, new Comparator() { @Override public int compare(String o1, String o2) { if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1) { String[] o1Arr = o1.split(","); int i1 = Integer.parseInt(o2); int i2 = Integer.parseInt(o1Arr[0]); return i2-i1; } return 0; } })); 

您假设String strToSearch的类型为“12,12”。 要使此代码工作,只需更改strToSearch

例如:

 Arrays.binarySearch(arr, "12,12", new Comparator)