1. 배열에 특정 값이 포함되어 있는지 확인하는 메소드
사용 목록을 사용하십시오
public static boolean useList (String [] arr, String targetValue) {return arrays.aslist (ARR) .crantains (targetValue);}세트 사용
public static boolean useet (String [] arr, String targetValue) {set <string> set = new Hashset <string> (Arrays.asList (ARR)); 반환 세트.루프 판단을 사용하십시오
public static boolean useloop (string [] arr, String targetvalue) {for (string s : arr) {if (s.equals (targetValue)) return true; } return false;}Arays.binarySearch () 사용
Arrays.binarySearch() 메소드는 순서 배열에만 사용할 수 있습니다! ! ! 배열이 변하지 않으면 결과는 매우 이상합니다.
순서 배열에 특정 값이 포함되어 있는지 여부를 찾는 것은 다음과 같습니다.
public static boolean usearraysbinarysearch (string [] arr, String targetValue) {int a = arrays.binarySearch (arr, targetValue); (A> 0) TRUE를 반환하는 경우; 그렇지 않으면 거짓을 반환하십시오;}시간 복잡성
다음 코드는 대략 다양한 방법의 시간 비용을 그릴 수 있습니다. 기본 아이디어는 배열에서 특정 값을 찾는 것이며 배열의 크기는 각각 5, 1k 및 10k입니다. 이 방법으로 얻은 결과는 정확하지는 않지만 가장 간단하고 명확한 방법입니다.
public static void main (String [] args) {String [] arr = new String [] { "cd", "bc", "ef", "de", "ab"}; // Long StartTime을 사용합니다 = System.Nanotime (); for (int i = 0; i <100000; i ++) {Uselist (arr, "a"); } long endtime = system.nanoTime (); 긴 기간 = 종료 시간 -StartTime; System.out.println ( "Uselist :" + duration / 10000000); // set startTime = System.NanOtime ()을 사용합니다. for (int i = 0; i <100000; i ++) {useet (arr, "a"); } endtime = system.nanoTime (); 지속 시간 = endtime -starttime; System.out.println ( "useet :" + duration / 10000000); // 루프 startTime을 사용합니다 = System.NanOtime (); for (int i = 0; i <100000; i ++) {Useloop (arr, "a"); } endtime = system.nanoTime (); 지속 시간 = endtime -starttime; System.out.println ( "useloop :" + duration / 10000000); // arrays.binarySearch () startTime = System.NanoTime (); for (int i = 0; i <100000; i ++) {usearraysbinarysearch (arr, "a"); } endtime = system.nanoTime (); 지속 시간 = endtime -starttime; System.out.println ( "usearraybinary :" + duration / 10000000);}실행 결과 :
USELIST : 13USESET : 72USELOOP : 5USEARRYSBINGINALSEARCH : 9
길이 1k 배열을 사용하십시오
String [] arr = new String [1000]; random s = new random (); for (int i = 0; i <1000; i ++) {arr [i] = string.valueof (s.nextint ());}결과:
USELIST : 112USESET : 2055USELOOP : 99UsearRaybinary : 12
길이 10k 배열을 사용하십시오
String [] arr = new String [10000]; random s = new random (); for (int i = 0; i <10000; i ++) {arr [i] = string.valueof (s.nextint ());}결과:
USELIST : 1590USESET : 23819USELOOP : 1526USEARRAYBINGARY : 12
요약
분명히 간단한 루프 방법을 사용하는 것은 컬렉션을 사용하는 것보다 더 효율적입니다. 많은 개발자들이 편의를 위해 첫 번째 방법을 사용하지만 효율성도 상대적으로 낮습니다. 배열을 컬렉션 유형으로 누르기 때문에 먼저 배열 요소를 통과 한 다음 컬렉션 클래스를 사용하여 다른 작업을 수행해야합니다.
Arrays.binarySearch() 사용하는 경우 배열을 정렬해야합니다. 위의 배열이 정렬되지 않으므로이 방법을 사용할 수 없습니다.
실제로 배열 또는 수집 클래스를 사용하여 배열에 특정 값이 포함되어 있는지 효율적으로 확인 해야하는 경우 정렬 된 목록 또는 트리는 O (log (n))의 시간 복잡성을 달성 할 수 있으며 해시셋은 O (1)을 달성 할 수 있습니다.
배열 사용
위의 외에도 Apache Commons 클래스 라이브러리는 배열 클래스를 제공하며 배열과 값 사이의 관계를 판단하기 위해 포함 된 방법을 사용할 수 있습니다.
import org.apache.commons.lang3.arrayutils; public static boolean usearrayutils (string [] arr, String targetvalue) {return arrayutils.crantains (arr, targetValue);}위의 길이의 배열을 사용하여 동일한 테스트를 수행했으며,이 방법의 효율은 세트 사용과 루프 판단을 사용하는 것 사이 (때로는 결과가 루프를 사용하는 것보다 더 이상적이었습니다)였습니다.
USELIST : 323USESET : 3028USELOOP : 141USEARRAYBINGINAL : 12USEARRAYUTILS : 181 ---------- USELIST : 3703USESET : 35183USELOOP : 3218USEARRAYBINAR : 14USEARRAYUTILS : 3125
실제로, 배열의 소스 코드를 보면, 포함되면 실제로 요소가 배열에 포함되어 있는지 판단하는 방법임을 알 수 있습니다.
일부 코드는 다음과 같습니다.
if (array == null) {return -1; } else {if (startIndex <0) {startIndex = 0; } int i; if (objectTofind == null) {for (i = startIndex; i <array.length; ++ i) {if (array [i] == null) {return i; }}} else if (array.getClass (). getComponentType (). isinstance (ObjectTofind)) {for (i = startIndex; i <array.length; ++ i) {if (objecttofind.equals (array [i])) {return i; }}} 반환 -1; }따라서 비교할 때 Arrayutils 도구 클래스를 사용하여 결합 된 숫자 조상과 관련된 일부 작업을 수행하는 것이 좋습니다. 결국, 그는 코드를 적게 쓸 수있게 해줄 수 있습니다 (혼자서 코드를 작성할 때 필연적으로 버그가 있기 때문에 Apache가 제공하는 오픈 소스 도구 라이브러리는 수많은 개발자가 테스트했습니다).
요약
좋아요, 위는이 기사에 관한 것입니다. 이 기사의 내용이 모든 사람이 Java를 배우거나 사용하는 데 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.