Java 对列表排序时在列表中查找值的最佳方法

Java 对列表排序时在列表中查找值的最佳方法,java,algorithm,search,sorting,Java,Algorithm,Search,Sorting,假设我有一个Java ArrayList,它已排序。现在我想找到x值的索引。如果没有超过30行的代码,最快的方法是什么?IndexOf方法的使用?在一个简单的for循环中遍历所有值?使用一些很酷的算法?我们谈论的是大约50个整数键。,但既然它只有50个项目,谁在乎呢,除非你不得不做数百万次?简单的线性搜索更简单,50个项目的性能差异可以忽略不计 编辑:您还可以使用内置的java.util.Collections方法。请注意,即使找不到该项,它也会返回一个插入点。您可能需要进行额外的检查,以确保该

假设我有一个Java ArrayList,它已排序。现在我想找到x值的索引。如果没有超过30行的代码,最快的方法是什么?IndexOf方法的使用?在一个简单的for循环中遍历所有值?使用一些很酷的算法?我们谈论的是大约50个整数键。

,但既然它只有50个项目,谁在乎呢,除非你不得不做数百万次?简单的线性搜索更简单,50个项目的性能差异可以忽略不计

编辑:您还可以使用内置的java.util.Collections方法。请注意,即使找不到该项,它也会返回一个插入点。您可能需要进行额外的检查,以确保该项目确实是您想要的。感谢@Matthew的指点。

,但既然它只有50个项目,谁会在乎呢,除非你不得不做数百万次?简单的线性搜索更简单,50个项目的性能差异可以忽略不计


编辑:您还可以使用内置的java.util.Collections方法。请注意,即使找不到该项,它也会返回一个插入点。您可能需要进行额外的检查,以确保该项目确实是您想要的。多亏@Matthew提供了指针。

tvanfosson是正确的,这两种方法的时间都很短,因此除非这段代码非常频繁地运行,否则不会有太大的区别


但是,Java内置了对列表(包括ArrayList)进行二进制搜索的功能。

tvanfosson是正确的,这两种方法的时间都非常短,因此除非此代码非常频繁地运行,否则不会有太大区别


但是,Java内置了对包括ArrayList在内的列表进行二进制搜索的功能。

如果键具有可接受的分布,考虑到执行时间,这可能是一种非常快速的方法


考虑编码时间IndexOf是一种可行的方法,或者是一种内置的二进制搜索(如果适用于您的数据类型),我来自C,不懂Java。

如果密钥具有可接受的分布,考虑执行时间可能是一种非常快的方法

import java.util.ArrayList;
import java.util.Collections;

ArrayList myList = new ArrayList();
// ...fill with values

Collections.sort( myList );
int index = Collections.binarySearch( myList, "searchVal" );
考虑到编码时间IndexOf是一种方法,或者是一种内置的二进制搜索,如果你的数据类型可用的话。我来自C,不懂Java

import java.util.ArrayList;
import java.util.Collections;

ArrayList myList = new ArrayList();
// ...fill with values

Collections.sort( myList );
int index = Collections.binarySearch( myList, "searchVal" );
编辑:未测试的代码


编辑:未经测试的代码

对于50个键,我完全同意。现在开发人员的时间比CPU时间更重要。使用IndexOf,就可以开始了。除了Java/has/this功能之外。二进制搜索是一个不错的选择。该列表目前可能只有50项,但谁知道代码在一两年内将必须处理什么..@Matthew-不知道-我已经写了很多Java,但我昨天刚刚开始为我正在进行的项目编写一个小applet。将更新。如果未找到该项,则返回-insertion point-1。如果你不关心插入点,只要检查返回值是否为非负。对于50个键,我完全同意。现在开发人员的时间比CPU时间更重要。使用IndexOf,就可以开始了。除了Java/has/this功能之外。二进制搜索是一个不错的选择。该列表目前可能只有50项,但谁知道代码在一两年内将必须处理什么..@Matthew-不知道-我已经写了很多Java,但我昨天刚刚开始为我正在进行的项目编写一个小applet。将更新。如果未找到该项,则返回-insertion point-1。因此,如果您不关心插入点,只需检查返回值是否为非负。