이 기사는 Java에서 무작위, 반복적 인 숫자의 기능을 구현하는 방법을 소개합니다. 초보자 인 경우이 기사는 일반적으로 인터뷰 중에 발생하기 때문에이 기사를 읽어야합니다. 내가 사람들을 모집 할 때, 나는 또한 다른 사람들 에게이 질문에 대해 물어보고, 주로 문제에 대한 모델과 기본 지식이 어떻게 고려되는지 보는 것을 좋아합니다.
나는이 기사가 처음으로 연락을 취한 친구들을 도울 수 있기를 바랍니다. 왜냐하면 나는 그것을 쓸 수없는 친구들에게 연락하거나 그것을 달성하기 위해 매우 평평한 사고 방식을 사용했기 때문입니다.
일반적으로 일부 개발 경험이있는 친구는 이러한 기능을 구현할 수 있지만 효율성의 문제 일뿐입니다. 우리가 그러한 문제에 직면 할 때, 우리는 항상 직접 순서로 생각하고 루프의 배열에 임의 숫자를 추가합니다. 숫자를 추가하는 과정에서 먼저이 숫자가 배열에 존재하는지 여부를 찾으십시오. 이 숫자가 존재하지 않으면 배열에 직접 추가됩니다. 이 숫자가 존재하면 추가되지 않습니다. 우리는 일반적으로 이런 식으로 문제를 고려하며 이러한 방식으로 기능을 구현할 수 있습니다. 내가 지금 말했듯이, 그것은 단지 효율성의 문제 일뿐입니다.
이 질문의 의미를 더 잘 이해하기 위해 먼저 특정 내용을 살펴 보겠습니다. 1-100의 임의 배열을 생성하지만 배열의 숫자는 반복 할 수는 없지만 위치는 무작위이지만 배열의 요소는 반복 할 수 없습니다.
여기서 우리는 배열의 길이를 지정하지 않았으며 1-100 사이의 길이를 만들 수 있습니다.
다음으로 여러 구현 방법을 살펴보고 이러한 방법을 비교해 봅시다 .
일반적으로 ArrayList 또는 Array를 사용하여 구현합니다. 다음 코드와 같이 ArrayList의 구현 프로세스를 먼저 살펴 보겠습니다.
import java.util.arraylist; import java.util.random;/** * arraylist * @description : * @file : demo.java * @package none * @author hanyonglu * @date 2012-10-18 06:16:55 PM * @Public Classion (public classion v1.0) (String) 대상 [] value = 새 개체 [20]; 랜덤 random = new random (); ArrayList <integer> list = new ArrayList <integer> (); for (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; if (! list.contains (number)) {list.add (number); }} 값 = list.toArray (); // 배열을 가로 지르고 (int i = 0; i <value.length; i ++) {system.out.print (값 [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }}}} 배열을 사용하여 구현하는 프로세스는 다음과 같습니다.
import java.util.random;/** * 배열을 사용한 구현 * @description : * @file : demo4.java * @package none * @author hanyonglu * @date 2012-10-18 06:27:38 pm * @version v1.0 */public class demo4 {public static void main (string [] [] values) {int); 랜덤 random = new random (); for (int i = 0; i <value.length; i ++) {int number = random.nextint (100)+1; for (int j = 0; j <= i; j ++) {if (number! = value [j]) {value [i] = 숫자; }}} // 배열을 가로 지르고 (int i = 0; i <valks.length; i ++) {system.out.print (값 [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }}}} 위의 두 구현 프로세스는 비교적 비효율적입니다. 추가 할 때 마다이 숫자가 현재 목록에 존재하는지 여부에 관계없이 시간 복잡성은 O (n^2)입니다. 우리는 이런 식으로 생각할 수 있습니다. 중복이 관련이 없기 때문에 해시 세트 및 해시 맵의 기능에 대해 생각할 수 있습니다. 해시 세트는 세트 인터페이스를 구현하고 세트의 수학적 정의는 복제와 순서가없는 세트입니다. 해시 맵은 맵을 구현하며 중복을 허용하지 않는 키입니다. 이렇게하면 해시 맵 또는 해시 세트를 사용하여 달성 할 수 있습니다.
Hashmap 구현을 사용하는 경우 키를 배열로 만 변환하면 다음과 같이 괜찮습니다.
import java.util.HashMap;import java.util.Iterator;import java.util.Random;import java.util.Map.Entry;/** * Implementation using HashMap* @Description: * @File: Demo.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 06:12:50 pm * @Version v1.0 */public class demo {public static void main (String [] args) {int n = 0; 대상 [] value = 새 개체 [20]; 랜덤 random = new random (); HASHMAP <개체, 개체> HASHMAP = NEW HASHMAP <Object, Object> (); // (int i = 0; i <values.length; i ++) {int number = random.nextint (100)+1; hashmap.put (번호, i); } // hashmap 값에서 배열 값 가져 오기 = hashmap.keyset (). toarray (); // (int i = 0; i <values.length; i ++) {system.out.print (values [i]+"/t")의 배열 및 인쇄 데이터를 가로지 릅니다. if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }} // iterator iter = hashmap.entryset (). iterator (); // traversal hashmap // while (iter.hasnext ()) {// enther <integer, integer> entry = (Entry) iter.next (); // int key = enther.getkey (// n ++; // system.. "/t"); // // if (n % 10 == 0) {// system.out.println ( "/n"); //} //}}} Hashset과 Hashmap의 관계가 너무 가깝기 때문에 Hashset은 하단에서 Hashmap을 사용하여 구현되지만 값 모음과 하나의 키 모음 만 있으므로 다음과 같이 Hashset을 사용하여 구현할 수도 있습니다.
import java.util.hashset; import java.util.random;/** * hashset * @description을 사용한 구현 : * @file : test.java * @package none * @author hanyonglu * @date 2012-10-18 06:11:41 PM * @version v1.0 */public vovid v1.0 * (strend void main) (string) (string) {public classe test () 무작위의(); 대상 [] value = 새 개체 [20]; Hashset <integer> Hashset = New Hashset <integer> (); // (int i = 0; i <valks.length; i ++) {int number = random.nextInt (100)+1; hashset.add (번호); } 값 = hashset.toArray (); // (int i = 0; i <values.length; i ++) {system.out.print (values [i]+"/t")의 배열 및 인쇄 데이터를 가로지 릅니다. if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }}}} 이것은 조금 더 효율적입니다. 배열의 길이를 제한하면 For Loop을 변환하여 Whlie 루프로 설정하면됩니다. 아래 그림과 같이 :
import java.util.hashset; import java.util.random;/** * hashset * @description : * @file : test.java * @package none * @author hanyonglu * @date 2012-10-18 05:11:41 PM * @version v1.0 */public vovel void main (stren whindr.) {strend void main () 무작위의(); 대상 [] value = 새 개체 [20]; Hashset <integer> Hashset = New Hashset <integer> (); // 랜덤 숫자를 생성하고 (hashset.size () <values.length) {hashset.add (random.nextint (100) + 1); } 값 = hashset.toArray (); // 배열을 가로 지르고 (int i = 0; i <value.length; i ++) {system.out.print (값 [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }}}}배열의 길이를 100으로 설정하고 아래 그림과 같이 달리기 효과를 확인할 수 있습니다.
위와 비교하여 해시 맵 사용은 비교적 효율적입니다. 실제로, 그것은 해시, 어레이, 그리고 마지막으로 배열리스트입니다. 10000 데이터를 생성하면 해시 맵을 사용하는 데 시간이 걸린다는 것을 알게됩니다. 0.05, 해시셋은 0.07, 배열은 0.20, Arraylist는 0.25s입니다. 관심이 있으시면 시간을 확인할 수 있습니다.
물론 해시 맵 구현을 사용하는 것 외에도 다른 효율적인 방법이 있습니다. 예를 들어, 배열에 숫자 1-100을 저장 한 다음 For Loop에서 두 개의 위시를 무작위로 생성 할 수 있습니다. 이 두 위시가 같지 않으면 배열에서 요소를 교환 할 수 있습니다. 구현 프로세스는 다음과 같습니다.
import java.util.random;/** * 랜덤 위치 변환 구현 * @description : * @file : demo4.java * @package none * @author hanyonglu * @date 2012-10-18 06:54:06 pm * @version v1.0 */public class demo4 {public static void main (string []). int temp1, temp2, temp3; 랜덤 r = 새로운 랜덤 (); for (int i = 0; i <value.length; i ++) {value [i] = i+1; } // 무작위로 values.length times for (int i = 0; i <value.length; i ++) {temp1 = math.abs (r.nextint ()) % (values.length-1); // 하나의 위치를 무작위로 생성하여 temp2 = math.abs (r.nextint ()) % (values.length-1); // (temp1! = temp2) {temp3 = value [temp1]; 값 [temp1] = 값 [temp2]; 값 [temp2] = temp3; }} // 배열을 가로 지르고 (int i = 0; i <20; i ++) {system.out.print (값 [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ( "/n"); }}}} 이 방법은 또한 비교적 효율적입니다. 10,000 개의 데이터가 생성되면 시간은 0.054s입니다.
배열에서 좌표 구현을 기반으로 더 많은 관련 솔루션을 변환 할 수 있으며 관련 정보를 자세히 참조 할 수 있습니다.
위의 것은 Java에서 임의의 비 반복 숫자의 기능을 구현하는 것입니다. 물론이 방법은 이러한 유형에 국한되지 않지만 다른 구현 방법이 있습니다. 나는 그것이 한동안 연락을 취한 친구들에게 도움이되기를 바랍니다. 그리고 그것이 Jade를 유치하고 끌어들이는 데 역할을 할 수 있기를 바랍니다.
원본 웹 사이트 : http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.