일반적으로 개발 경험이 있는 친구라면 이러한 기능을 실현할 수 있지만 이는 효율성의 문제일 뿐입니다. 우리는 보통 이런 문제에 직면할 때 항상 평면적인 순서로 생각합니다. 먼저 배열을 생성한 다음 루프에서 배열에 임의의 숫자를 추가합니다. 숫자를 추가하는 과정에서 먼저 배열에 존재하는지 확인합니다. 이 번호가 없으면 배열에 직접 추가되고, 있으면 추가되지 않습니다. 우리는 일반적으로 이런 식으로 문제를 생각하고, 이렇게 생각함으로써 기능을 얻을 수 있습니다. 방금 말했듯이 그것은 효율성의 문제일 뿐입니다.
이 질문의 의미를 더 잘 이해하기 위해 먼저 특정 내용을 살펴보겠습니다. 1-100의 무작위 배열을 생성하지만 배열의 숫자는 반복될 수 없습니다. 즉, 위치는 무작위이지만 배열 요소는 반복할 수 없습니다. 여기서 배열의 길이는 지정되지 않았으며 1-100 사이의 길이로 설정할 수 있습니다.
다음으로 이를 더 잘 구현하는 방법을 살펴보겠습니다. 일반적으로 다음 코드와 같이 ArrayList를 사용하여 구현합니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.sunzn.randomnumber;
import java.util.ArrayList;
import java.util.Random;
공개 수업 데모 {
공개 정적 무효 메인(String[] args) {
객체[] 값 = 새로운 객체[20];
무작위 무작위 = 새로운 무작위();
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < value.length; i++) {
int 숫자 = random.nextInt(100) + 1;
if (!list.contains(number)) {
목록.추가(번호);
}
}
값 = list.toArray();
/************ 배열을 탐색하고 데이터를 인쇄합니다************/
for (int i = 0; i < value.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
위의 구현 프로세스는 상대적으로 비효율적입니다. 추가할 때마다 해당 숫자가 현재 목록에 있는지 여부를 순회해야 하므로 시간 복잡도는 O(N^2)입니다. 우리는 이것을 이렇게 생각할 수 있습니다: 중복이 없기 때문에 HashSet 및 HashMap의 기능에 대해 생각할 수 있습니다. HashSet은 Set 인터페이스를 구현합니다. Set의 수학적 정의는 중복과 순서가 없는 컬렉션입니다. HashMap은 Map을 구현하고 중복 키를 허용하지 않습니다. 이런 방식으로 HashMap이나 HashSet을 사용하여 이를 달성할 수 있습니다.
HashMap을 사용하여 구현하는 경우 해당 키를 배열로 변환하기만 하면 됩니다. 코드는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.sunzn.randomnumber;
java.util.HashMap 가져오기;
import java.util.Random;
공개 수업 데모 {
공개 정적 무효 메인(String[] args) {
객체[] 값 = 새로운 객체[20];
무작위 무작위 = 새로운 무작위();
HashMap<Object, Object> hashMap = new HashMap<Object, Object>();
/********* 난수를 생성하고 HashMap에 저장합니다 *******/
for (int i = 0; i < value.length; i++) {
int 숫자 = random.nextInt(100) + 1;
hashMap.put(번호, i);
}
/************ HashMap에서 배열 가져오기************/
값 = hashMap.keySet().toArray();
/************* 배열을 탐색하고 데이터를 인쇄합니다************/
for (int i = 0; i < value.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
HashSet과 HashMap의 관계가 너무 가깝기 때문에 하위 계층에서는 HashMap을 사용하여 HashSet을 구현합니다. 그러나 Value의 모음은 없고 Key의 모음만 있으므로 HashSet을 사용하여 구현할 수도 있습니다. :
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.sunzn.randomnumber;
import java.util.HashSet;
import java.util.Random;
공개 수업 데모 {
공개 정적 무효 메인(String[] args) {
무작위 무작위 = 새로운 무작위();
객체[] 값 = 새로운 객체[20];
HashSet<Integer> hashSet = new HashSet<Integer>();
/********* 난수를 생성하여 HashSet에 저장합니다 *******/
for (int i = 0; i < value.length; i++) {
int 숫자 = random.nextInt(100) + 1;
hashSet.add(번호);
}
값 = hashSet.toArray();
/************* 배열을 탐색하고 데이터를 인쇄합니다**********/
for (int i = 0; i < value.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
이 구현은 약간 더 효율적입니다. 배열의 길이를 제한하는 경우 for 루프를 변경하고 이를 whlie 루프로 설정하기만 하면 됩니다. 아래와 같이:
다음과 같이 코드 코드를 복사합니다 .
패키지 cn.sunzn.randomnumber;
import java.util.HashSet;
import java.util.Random;
공개 수업 데모 {
공개 정적 무효 메인(String[] args) {
무작위 무작위 = 새로운 무작위();
객체[] 값 = 새로운 객체[20];
HashSet<Integer> hashSet = new HashSet<Integer>();
/****** 난수를 생성하여 HashSet에 저장합니다 ******/
while (hashSet.size() < 값.길이) {
hashSet.add(random.nextInt(100) + 1);
}
값 = hashSet.toArray();
/************ 배열을 탐색하고 데이터를 인쇄합니다************/
for (int i = 0; i < value.length; i++) {
System.out.print(values[i] + "/t");
if ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}