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