Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对成对列表进行二进制搜索_Java_Arraylist_Binary Search - Fatal编程技术网

Java 对成对列表进行二进制搜索

Java 对成对列表进行二进制搜索,java,arraylist,binary-search,Java,Arraylist,Binary Search,我需要找到匹配元素的元素 我的程序运行正常,但效率不高。我有一个非常大的数组列表对(超过4000个元素),我使用二进制搜索来查找匹配的索引 public int search(String element) { ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < pairs.size(); i++) { list.add(pairs.get(i).getEle

我需要找到匹配
元素的
元素

我的程序运行正常,但效率不高。我有一个非常大的
数组列表对
(超过4000个元素),我使用二进制搜索来查找匹配的索引

public int search(String element) {
  ArrayList<String> list = new ArrayList<String>();
  for (int i = 0; i < pairs.size(); i++) {
      list.add(pairs.get(i).getElem());
  }
  return index = Collections.binarySearch(list, element);
}
public int搜索(字符串元素){
ArrayList=新建ArrayList();
对于(int i=0;i
我想知道是否有比使用循环将一半的ArrayList对复制到新的ArrayList列表中更有效的方法。 Obj的构造函数:
Obj x=newobj(字符串元素,字符串字)

如果您的主列表(
pairs
)没有更改,那么我建议创建一个
TreeMap
,以保持反向
索引结构,例如:

List<String> pairs = new ArrayList<String>(); //list containing 4000 entries

Map<String, Integer> indexMap = new TreeMap<>();

int index = 0;
for(String element : pairs){
    indexMap.put(element, index++);
}
这将为您提供所需的
索引
,或者
null
(如果元素不存在)。此外,如果元素可以多次出现在列表中,则可以将
indexMap
更改为
Map

您当前的算法迭代列表并调用二进制搜索,因此迭代和
O(logn)
的复杂性将是
O(logn)
,而
TreeMap
保证了
log(n)
的时间开销,因此它将更快


这是
TreeMap
的文档,看起来问题已经解决了。 由于我的问题是ArrayList pairs类型是
Obj
,而
element
类型是String,因此我无法使用Collections.binarySearch,我决定创建一个新变量
Obj x=新的Obj(元素“”)。当我的
compareTo
方法比较两个
elem
s并忽略
Obj x
的第二个变量时,字符串似乎没有引起任何问题(它通过了JUnit测试)

我的更新方法:

public int search(String element) {
  Obj x = new Obj(element, "");
  int index = Collections.binarySearch(pairs, x);

是-更有效的方法是自己编写对列表的二进制搜索,而不是每次调用search()时都创建列表的副本。使用其他方法,并提供直接比较列表元素的方法。
public int search(String element) {
  Obj x = new Obj(element, "");
  int index = Collections.binarySearch(pairs, x);