문제
나는 배열에서 뚜렷한 숫자를 인쇄하는 작은 프로그램을 작성하려고합니다. 예를 들어 사용자가 1,1,3,5,7,4,3에 들어가면 프로그램은 1,3,5,7,4 만 인쇄합니다.
함수의 다른 선에 오류가 발생합니다. checkDuplicate
.
지금까지 내 코드는 다음과 같습니다.
import javax.swing.JOptionPane;
public static void main(String[] args) {
int[] array = new int[10];
for (int i=0; i<array.length;i++) {
array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
+ "an integer:"));
}
checkDuplicate (array);
}
public static int checkDuplicate(int array []) {
for (int i = 0; i < array.length; i++) {
boolean found = false;
for (int j = 0; j < i; j++)
if (array[i] == array[j]) {
found = true;
break;
}
if (!found)
System.out.println(array[i]);
}
return 1;
}
}
해결책
우선, "else if
"진술은 IF에 어떤 조건도 제공하지 않기 때문에 문장이 올바르지 않습니다 (IF를 원할 경우 작성해야합니다."if (condition) ...
").
둘째, 결정할 수 없습니다 내부 내부 루프, 값을 인쇄 해야하는 경우 : 코드가 작동하는 방식으로 값 배열을 작성합니다 [I 각 값 배열에 대해 [J 배열과 다릅니다 [i]!
셋째 : 내부 루프는 0에서 외부 인덱스로 만 이동하면됩니다. i-1
: 각 요소에 대해, 첫 번째 발생 여부를 결정해야합니다 (즉, 이전 색인에서 동일한 값이 발생하는 경우). 그렇다면 인쇄하지 않으면 무시하십시오.
적절한 구현 CheckDuplicate()
다음과 같습니다.
public static void checkDuplicate(int array []) {
for (int i = 0; i < array.length; i++) {
boolean found = false;
for (int j = 0; j < i; j++)
if (array[i] == array[j]) {
found = true;
break;
}
if (!found)
System.out.println(array[i]);
}
}
그러나 물론 어떤 종류의 것입니다 Set
더 큰 배열의 경우 훨씬 더 효율적일 것입니다 ...
편집 : 물론, 마이어스 (의견 참조) CheckDuplicate()
값을 반환하지 않으면 반환 유형이 있어야합니다. void
(대신에 int
). 위 코드에서 이것을 수정했습니다 ...
다른 팁
가장 간단한 방법은 모든 요소를 Set<Integer>
그런 다음 내용을 인쇄합니다 Set
.
삽입 시간으로 순서대로 설정 한 다음 필요한 경우 배열로 다시 변환하십시오.
new LinkedHashSet<Integer>(array).toArray()
모든 정수를 세트에 던지십시오. 복제물은 세트에 추가되지 않으며 고유 한 정수 세트가 남아 있습니다.
팩트 컬렉션 방법으로 인해 Java Collection API를 사용하여 원하는 것은 Java Collection API를 사용하여 달성 할 수 있습니다. Object
프리미티브가 아닙니다. J2SE에는 변환하는 방법이 없습니다. int[]
에게 Integer[]
, 그러나 아파치 커먼즈 랭 도서관 그런 유용한 방법이 포함되어 있습니다 arrayutils.toobject () 그리고 arrayutils.toprimitive ().
그것들을 사용하여 정수 배열에서 복제 된 요소를 제거하는 방법은 다음과 같습니다.
public static int[] removeDuplicates(int... array) {
Integer[] ints = ArrayUtils.toObject(array);
Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
}
응용 프로그램에 더 많은 배열/컬렉션 조작이 포함될 가능성이있는 경우 처음부터 물건을 구현하는 대신 해당 라이브러리를 살펴 보는 것이 좋습니다. 그러나 학습 목적으로하고 있다면 코드를 멀리하십시오!
각 숫자를 세트 배열이 아닌 구현. 세트는 특히 중복을 걸러 내려는 요소 모음을 저장하기위한 것입니다.
다른 사람들이 제안한대로 세트를 사용하거나 호환 가능한 클래스를 사용하십시오. 호환 클래스 목록에서는 포함 된 메소드를 사용하여 배열에 이미 존재하는지 확인하십시오.
import java.util.scanner; 공개 클래스 printDistInctNumbers {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int [] numberArray = createArray();
System.out.println("The number u entered are: ");
displayArray(numberArray);
getDistinctNumbers(numberArray);
}
public static int[] createArray() {
Scanner input = new Scanner(System.in);
int [] numberCollection = new int [10];
System.out.println("Enter 10 numbers");
for(int i = 0; i < numberCollection.length; i++){
numberCollection[i] = input.nextInt();
}
return numberCollection;
}
public static void displayArray(int[] numberArray) {
for(int i = 0; i < numberArray.length; i++){
System.out.print(numberArray[i]+" ");
}
}
public static void getDistinctNumbers(int[] numberArray) {
boolean isDistinct = true;
int temp = 0;
int [] distinctArrayNumbers = new int [10];
for ( int i = 0; i < numberArray.length; i++){
isDistinct = true;
temp = numberArray[i];
for( int j = 0; j < distinctArrayNumbers.length; j++){
if( numberArray[i] == distinctArrayNumbers[j] ){
isDistinct = false;
}
}
if(isDistinct){
distinctArrayNumbers[temp]=numberArray[i];
temp++;
}
}
displayDistinctArray(distinctArrayNumbers);
}
public static void displayDistinctArray(int[] distinctArrayNumbers) {
for( int i = 0; i < distinctArrayNumbers.length; i++){
if(distinctArrayNumbers[i] != 0){
System.out.println(distinctArrayNumbers[i]);
}
}
}
}