답변:
Arrays
유틸리티 클래스를 사용하여이를 수행하는 몇 가지 방법이 있습니다.
배열이 정렬 되지 않고 기본 요소의 배열 이 아닌 경우 :
java.util.Arrays.asList(theArray).indexOf(o)
배열 이 프리미티브이고 정렬되지 않은 경우 Kerem Baydoğan , Andrew McKinlay 또는 Mishax 와 같은 다른 답변 중 하나가 제공하는 솔루션을 사용해야합니다 . 위의 코드 theArray
는 원시적 인 경우에도 컴파일 되지만 (경고 발생 가능성이 있음) 그럼에도 불구하고 완전히 잘못된 결과를 얻을 수 있습니다.
배열이 정렬되면 성능을 위해 이진 검색을 사용할 수 있습니다.
java.util.Arrays.binarySearch(theArray, o)
T...
인 경우 인수 의 실제 런타임 유형은입니다. T[]
0 개 이상의 매개 변수 유형 T
을 전달하면 새로 구성된 배열에 랩핑되어 전달됩니다. 전달되는 매개 변수가 이미 유형 T[]
인 경우 구문 설탕이 무시됩니다.
.indexOf
)은 기본 요소에는 유효하지 않습니다.
Arrays.toList(list).sublist(from,to).indexOf(o)
범위 내에서 요소를 검색하는 데 사용 합니다 [from, to)
.
배열에는 indexOf()
메소드 가 없습니다 .
아마이 Apache Commons Lang ArrayUtils
방법은 당신이 찾고있는 것입니다.
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
기본형의 경우 복싱을 피하려면 Guava 에 기본형 배열에 대한 도우미가 있습니다 (예 : Ints.indexOf (int [] array, int target)).
없습니다. java.util.List
*를 사용 하거나 직접 작성할 수 있습니다 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;
}
* 당신은 사용하여 배열에서 하나를 만들 수 있습니다 Arrays#asList()
T
은 잘못된 것입니다. 그것은 타입 안전을 제공하지 않으며, 실수하기 쉽다. 타입 안전하다 ... 더 나은 사용 Object
indexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
C #에서와 달리 당신은이 곳 사항 Array.indexOf의 방법을, 그리고 당신은이 자바 스크립트 같이 IndexOf의 방법은 자바의 API합니다 ( Array
그리고 Arrays
특히 클래스) 그런 방법이 없습니다.
이 메소드 indexOf (보완 자 lastIndexOf와 함께)는 java.util.List 인터페이스에 정의되어 있습니다. indexOf 및 lastIndexOf는 오버로드되지 않으며 Object를 매개 변수로만 사용합니다.
배열이 정렬 된 경우 Arrays 클래스는 binarySearch 메서드의 오버로드를 정의하여 O (n 대신 가능한 최고의 성능 (O (log n)으로 찾고있는 요소의 인덱스를 찾을 수 있음)을 정의하기 때문에 운이 좋았습니다. ), 후자는 indexOf)에 의해 수행 된 순차적 검색에서 기대할 수있는 것입니다. 다음 네 가지 고려 사항이 있습니다.
배열은 자연 순서로 또는 인수로 제공 한 Comparator의 순서로 정렬되어야합니다. 또는 키보다 "낮은"요소는 배열에서 해당 요소 앞에 와야합니다. 키가 배열에서 해당 요소 다음에 와야하는 "보다 큼"
일반적으로 indexOf를 사용하여 키가 배열에 있는지 여부를 판별하는 테스트 (반환 값이 -1이 아닌지 확인)는 binarySearch를 보유하지 않습니다. 리턴 된 값은 키가 존재하지 않지만 존재했을 경우 예상되는 인덱스를 나타내므로 리턴 값이 0보다 작은 지 검증해야합니다.
배열에 키와 동일한 여러 요소가 포함 된 경우 binarySearch에서 얻은 내용은 정의되지 않습니다. 이것은 첫 번째 발생을 리턴하는 indexOf와 마지막 발생을 리턴하는 lastIndexOf와 다릅니다.
부울 배열은 먼저 모든 거짓을 포함하고 모든 참을 포함하는 경우 정렬 된 것처럼 보일 수 있지만 계산되지 않습니다. 부울 배열을 허용하는 binarySearch 메소드를 대체하지 않으며 배열에서 첫 번째 true가 나타나는 위치를 감지 할 때 O (log n) 성능을 원하면 영리한 무언가를 수행해야합니다. 부울 및 상수 Boolean.FALSE 및 Boolean.TRUE.
배열이 프리미티브 유형이 아닌 정렬되지 않은 경우 java.util.Arrays 의 asList 메소드를 호출하여 List의 indexOf 및 lastIndexOf 메소드를 사용할 수 있습니다 . 이 메소드는 배열 주위에 AbstractList 인터페이스 래퍼를 리턴합니다. 배열의 복사본을 만들지 않기 때문에 최소한의 오버 헤드가 필요합니다. 언급했듯이,이 방법은 오버로드되지 않으므로 참조 유형의 배열에서만 작동합니다.
배열이 정렬되지 않고 배열 유형 이 원시적 이라면 Java API를 사용하는 것이 좋지 않습니다 . for 루프 또는 정적 유틸리티 메소드를 작성하십시오.이 메소드는 오브젝트 인스턴스화의 일부 오버 헤드를 포함하는 asList 방식에 비해 성능상의 이점이 있습니다. 배열의 모든 요소를 반복하는 무차별 강제 실행 루프를 작성하는 것이 훌륭한 해결책이 아니라고 생각하는 경우 indexOf를 호출 할 때 Java API가 수행하는 것과 정확히 일치한다는 점을 받아들입니다. 다음과 같이 만들 수 있습니다.
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;
}
여기에 자신 만의 메소드를 작성하지 않으려면 Guava와 같은 개발 프레임 워크에서 메소드를 사용하십시오. 거기에서 indexOf 및 lastIndexOf 의 구현을 찾을 수 있습니다 .
직접 코딩하는 것 이외의 배열에서 "indexOf"를 기억하지는 않지만 배열에 기본 유형이 포함되어 있으면 많은 java.util.Arrays#binarySearch(...)
메소드 중 하나를 사용할 수 있습니다 ( 배열 javadoc 참조 ).
배열 자체에는 해당 방법이 없습니다. 목록은, 그러나, 수행합니다 같이 IndexOf를
ArrayList
- 모든 자바 List
있다 indexOf()
.
아마도 배열이 아닌 java.util.ArrayList를 생각하고있을 것입니다 .
제프리 한틴 의 대답은 좋지만 이것이 그렇게하거나 그렇지 않으면 제약이 있습니다 ...
자체 확장 방법을 작성할 수 있으며 항상 원하는 방식으로 작동합니다.
Lists.indexOf(array, x -> item == x); // compare in the way you want
그리고 여기 당신의 확장이 있습니다
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++;
}
}
참고 :이 방법은 int 유형의 배열에 사용할 수 있으며 약간의 변경 사항이있는 다른 유형 에도이 알고리즘을 사용할 수 있습니다