2013-02-20 2 views
0

파일 배열을 검색하고 새 파일 배열에 고유 한 파일 이름을 저장하고 새 배열을 반환하는 프로그램을 만들려고합니다. (있는 경우). 내 코드가 실행되지만 설정 한 길이가없는 새 파일 배열에 값을 저장하지 않습니다. 호출 할 때 빈 배열을 반환합니다. 내가 설정 한 방식으로, 중복이 있는지 검사하고, 중복 된 경우 한 번 저장합니다. 그렇지 않으면 값을 저장하고 계속합니다. 문제는 for 루프를 통해 실행 된 후에는이 값을 저장하지 않는다는 것입니다. 파일 배열에 값을 저장하는 더 좋은 방법이 있습니까?다른 파일 배열에 파일 배열 값을 저장하는 방법

여기 내 테스터 블록에서 파일 배열을받는 uniqueFile입니다.

public static File[] getUnique(File[] files) { 
    int count = 0, place = 0; 
    File[] newFile = new File[] {}; 
    for (int i = 0; i < files.length; i++) { 
     count = 0; 
     for (int x = 1; x < files.length; x++) { 
      if (files[i].equals(files[x])) 
       count++; 
     } 
     try { 
      if (count >= 1) 
       newFile[place] = files[i]; 
      else 
       newFile[place] = files[i]; 
     } catch (Exception e) { 

     } 
     place++; 
    } 

    return newFile; 
} 

이 내 테스터 블록 :

{ 
    File Freckle = new File("Freckle"); 
    File Pickle = new File("Pickle"); 
    File Sam = new File("Sam"); 
    File Cat = new File("Cat"); 
    File[] files = new File[] { Freckle, Pickle, Freckle, Sam, Cat, 
      Pickle }; 

    File[] output = ArrayExercises.getUnique(files); 
    System.out.println(Arrays.toString(output)); 
} 

가 내가 일하는 것이 있는지 확인하기 위해 테스트하는 일반적인 파일 이름에 넣어. 결국 실제 파일을 포함 시키겠다.하지만 계속 진행하기 전에 먼저이 버그를 알아 내고 싶다.

+0

대신 세트를 사용해야하는 이유는 무엇입니까? – Perception

+0

Java에서 변수 이름을 소문자로 사용하는 것이 좋습니다 (예 :'freckle'가 아니라'freckle'). 이것은 다른 독자가 대문자 인 클래스에서 변수 이름을 구별하는 데 도움이됩니다. –

답변

3

당신은 스스로를 매우 어렵게 만들고 있습니다. Java가 모든 작업을 처리하도록하십시오. LinkedHashSet을 사용하여 작성하면 독창성을 제공하고 삽입 순서를 유지할 수 있습니다. 또한 모든 값을 다른 모든 값과 비교하는 것보다 효율적입니다.

File [] input = {Freckle, Pickle, Freckle, Sam, Cat, Pickle}; 
Set<File> tmp = new LinkedHashSet<File>(); 
for (File each : input) { 
    tmp.add(each); 
} 
File [] unique = new File[tmp.size()]; 
int i = 0; 
for (File each : tmp) { 
    unique[i++] = each; 
} 
System.out.println(Arrays.toString(unique)); 
0

다른 사람들도 말했듯이 Java Collections API를 사용하면 훨씬 쉽습니다. 그러나 잠시 동안 당신의 솔루션을 작동시키고 싶다고합시다.

문제는 새 배열의 길이가 0이고 여기에 매우 이상한 코드가 있다는 것입니다.

 if (count >= 1) 
      newFile[place] = files[i]; 
     else 
      newFile[place] = files[i]; 

테스트가 의미가 없으므로 카운트 값과 상관없이 똑같은 일을합니다. 비 중복 문자열을 배열에 추가 할 때도 place 만 증분해야합니다. 또한 try/catch는 무의미합니다. 일반적인 예외를 잡는 것은 나쁜 습관이다.

당신이 아는 것이 아래에 더 많지만, 심지어이긴하지만 정확히 배열에 고유 항목 만 포함될 수 있습니다. 이전과 같은 길이가 될 수 있습니다.

public static File[] getUnique(File[] files) { 
    place = 0; 
    File[] newFile = new File[files.size()]; //you were creating an empty array. 
    for (int i = 0; i < files.length; i++) { 
     boolean duplicate = false; // not interested in ho many dupes, just if there is one. 
     for (int x = 1; x < files.length; x++) { 
      if (files[i].equals(files[x])) { 
       duplicate = true; 
       break; // no point in checking the rest. 
      } 
     } 
     // why on earth did you have a try catch? 
     if (!duplicate) { 
      newFile[place++] = files[i]; 
     } 

    } 

    return newFile; 
} 

은 당신이 정말해야 할 것은 그렇지 않으면 비효율적 인 코드를 노트에 자신을 묶는하고,이를 버리고 다른 포스터 제안으로 LinkedHashMap 같은 것을 사용하여 다시 시작하는 것입니다.

관련 문제