Câu trả lời:
Có một vài cách để thực hiện điều này bằng cách sử dụng Arrays
lớp tiện ích.
Nếu mảng không được sắp xếp và không phải là mảng nguyên thủy:
java.util.Arrays.asList(theArray).indexOf(o)
Nếu mảng là nguyên thủy và không được sắp xếp, người ta nên sử dụng một giải pháp được cung cấp bởi một trong những câu trả lời khác như của Kerem Baydoğan , Andrew McKinlay hoặc Mishax . Đoạn mã trên sẽ biên dịch ngay cả khi theArray
là nguyên thủy (có thể phát ra cảnh báo) nhưng dù sao bạn cũng sẽ nhận được kết quả hoàn toàn không chính xác.
Nếu mảng được sắp xếp, bạn có thể sử dụng tìm kiếm nhị phân cho hiệu suất:
java.util.Arrays.binarySearch(theArray, o)
T...
, loại thời gian chạy thực tế của đối số là T[]
và truyền 0 hoặc nhiều tham số loại T
kết quả trong đó chúng được gói vào một mảng được xây dựng mới và được thông qua. Nếu tham số được truyền đã là loại T[]
, đường cú pháp được bỏ qua.
.indexOf
) không hợp lệ đối với nguyên thủy.
Arrays.toList(list).sublist(from,to).indexOf(o)
để tìm kiếm một yếu tố trong phạm vi [from, to)
.
Mảng không có indexOf()
phương thức.
Có lẽ ArrayUtils
phương thức Apache Commons Lang này là những gì bạn đang tìm kiếm
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
Đối với người nguyên thủy, nếu bạn muốn tránh quyền anh, Guava có người trợ giúp cho mảng nguyên thủy, ví dụ như Ints.indexOf (int [] mảng, int target)
Chẳng có ai. Sử dụng dấu java.util.List
* hoặc bạn có thể tự viết indexOf()
:
public static <T> int indexOf(T needle, T[] haystack)
{
for (int i=0; i<haystack.length; i++)
{
if (haystack[i] != null && haystack[i].equals(needle)
|| needle == null && haystack[i] == null) return i;
}
return -1;
}
* bạn có thể tạo một từ mảng của mình bằng cách sử dụng Arrays#asList()
T
là sai lệch. Nó không cung cấp bất kỳ loại an toàn nào, dễ nhầm là loại an toàn ... sử dụng tốt hơn Object
indexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
Không giống như trong C #, nơi bạn có Array.IndexOf phương pháp, và JavaScript, nơi bạn có indexOf phương pháp, API của Java (các Array
và Arrays
các lớp học đặc biệt) không có phương pháp như vậy.
Phương thức indexOf này (cùng với phần bổ sung last IndexOf) được định nghĩa trong giao diện java.util.List . Lưu ý rằng indexOf và lastIndexOf không bị quá tải và chỉ lấy một đối tượng làm tham số.
Nếu mảng của bạn được sắp xếp , bạn sẽ gặp may vì lớp Arrays định nghĩa một loạt các tình trạng quá tải của phương thức binarySearch sẽ tìm chỉ mục của phần tử bạn đang tìm kiếm với hiệu suất tốt nhất có thể (O (log n) thay vì O (n ), thứ hai là những gì bạn có thể mong đợi từ một tìm kiếm tuần tự được thực hiện bởi indexOf). Có bốn cân nhắc:
Mảng phải được sắp xếp theo thứ tự tự nhiên hoặc theo thứ tự của Bộ so sánh mà bạn cung cấp làm đối số hoặc ít nhất là tất cả các phần tử "nhỏ hơn" khóa phải đến trước phần tử đó trong mảng và tất cả các phần tử là "lớn hơn" khóa phải đến sau phần tử đó trong mảng;
Kiểm tra mà bạn thường làm với indexOf để xác định xem một khóa có nằm trong mảng không (xác minh nếu giá trị trả về không -1) không giữ với binarySearch. Bạn cần xác minh rằng giá trị trả về không nhỏ hơn 0 vì giá trị được trả về sẽ cho biết khóa không có mặt nhưng chỉ số mà nó sẽ được mong đợi nếu nó tồn tại;
Nếu mảng của bạn chứa nhiều phần tử bằng với khóa, những gì bạn nhận được từ binarySearch sẽ không được xác định; điều này khác với indexOf sẽ trả về lần xuất hiện đầu tiên và lần cuối IndexOf sẽ trả về lần xuất hiện cuối cùng.
Một mảng các booleans có thể được sắp xếp nếu nó đầu tiên chứa tất cả các lỗi và sau đó là tất cả các dấu vết, nhưng điều này không được tính. Không có ghi đè phương thức binarySearch chấp nhận một mảng booleans và bạn sẽ phải làm điều gì đó thông minh ở đó nếu bạn muốn hiệu suất O (log n) khi phát hiện nơi đúng đầu tiên xuất hiện trong một mảng, ví dụ như sử dụng một mảng Booleans và các hằng số Boolean.FALSE và Boolean.TRUE.
Nếu mảng của bạn không được sắp xếp và không phải kiểu nguyên thủy , bạn có thể sử dụng các phương thức indexOf và last IndexOf của List bằng cách gọi phương thức asList của java.util.Arrays. Phương thức này sẽ trả về một trình bao bọc giao diện AbstractList xung quanh mảng của bạn. Nó liên quan đến chi phí tối thiểu vì nó không tạo ra một bản sao của mảng. Như đã đề cập, phương pháp này không bị quá tải nên điều này sẽ chỉ hoạt động trên các mảng của các loại tham chiếu.
Nếu mảng của bạn không được sắp xếp và loại của mảng là nguyên thủy , bạn sẽ không gặp may với API Java. Viết vòng lặp của riêng bạn hoặc phương thức tiện ích tĩnh của riêng bạn, chắc chắn sẽ có lợi thế về hiệu suất so với cách tiếp cận asList liên quan đến một số chi phí của việc khởi tạo đối tượng. Trong trường hợp bạn lo ngại rằng việc viết một lực mạnh mẽ cho vòng lặp lặp trên tất cả các phần tử của mảng không phải là một giải pháp tao nhã, hãy chấp nhận rằng đó chính xác là những gì API Java đang làm khi bạn gọi indexOf. Bạn có thể làm một cái gì đó như thế này:
public static int indexOfIntArray(int[] array, int key) {
int returnvalue = -1;
for (int i = 0; i < array.length; ++i) {
if (key == array[i]) {
returnvalue = i;
break;
}
}
return returnvalue;
}
Nếu bạn muốn tránh viết phương pháp của riêng mình ở đây, hãy xem xét sử dụng một phương pháp từ khung phát triển như Guava. Ở đó bạn có thể tìm thấy việc triển khai indexOf và lastIndexOf .
Tôi không nhớ lại "indexOf" trên các mảng khác ngoài việc tự mã hóa nó ... mặc dù bạn có thể sử dụng một trong nhiều java.util.Arrays#binarySearch(...)
phương thức (xem Arrays javadoc ) nếu mảng của bạn chứa các kiểu nguyên thủy
Giao diện Danh sách có phương thức indexOf () và bạn có thể lấy Danh sách từ mảng của mình bằng phương thức asList () của Array. Ngoài ra, bản thân Array không có phương thức như vậy. Nó có một phương thức binarySearch () cho các mảng được sắp xếp.
Có lẽ bạn đang nghĩ về java.util.ArrayList , không phải là mảng.
Câu trả lời của Jeffrey Hantin là tốt nhưng nó có một số hạn chế, nếu điều này làm điều này hay cách khác ...
Bạn có thể viết phương thức mở rộng của riêng bạn và nó luôn hoạt động theo cách bạn muốn.
Lists.indexOf(array, x -> item == x); // compare in the way you want
Và đây là phần mở rộng của bạn
public final class Lists {
private Lists() {
}
public static <T> int indexOf(T[] array, Predicate<T> predicate) {
for (int i = 0; i < array.length; i++) {
if (predicate.test(array[i])) return i;
}
return -1;
}
public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
for (int i = 0; i < list.size(); i++) {
if (predicate.test(list.get(i))) return i;
}
return -1;
}
public interface Predicate<T> {
boolean test(T t);
}
}
int findIndex(int myElement, int[] someArray){
int index = 0;
for(int n: someArray){
if(myElement == n) return index;
else index++;
}
}
Lưu ý: bạn có thể sử dụng phương thức này cho các mảng kiểu int, bạn cũng có thể sử dụng thuật toán này cho các loại khác với những thay đổi nhỏ