2014-04-22 2 views
1

일부 오류가 발생했습니다. 내 배열은 다음과 같습니다정렬 전에 모든 null 배열 값을 제거하십시오.

String words[] = new String[50000]; 

사용자가 배열

words[i]=c.readLine(); 

이 프로그램은 루프에 대한 무한한 번 중복 값이 ​​inputed되어 종료됩니다에 입력 값을 요청합니다. 이제 프로그램은 알파벳 순서로 배열을 정렬해야하지만 아직 일부 null 값을 정렬하려고하고 오류를 반환합니다.

Arrays.sort(words, String.CASE_INSENSITIVE_ORDER);   
for (int a = 0; a < words.length; a++) { 
    c.println(words[a]); 
} 

이 프로그램은 사용자가 정확히 50000 값을 입력 한 경우에만 작동합니다. 사용자가 입력 할 값의 수를 추측 할 수 없습니다. 어떻게 해결할 수 있습니까?

알파벳순으로 정렬하기 전에 모든 null 값을 제거해야한다고 생각합니다. 어떤 아이디어?

+2

사용을 값없이 당신은'크기의 확실하지 않은 경우

int notNull=words.length; for(int i= 0;i<words.length;i++){ if(words[i]==null){ notNull=i; break; } } String[] newWords=Arrays.copyOfRange(words, 0, notNull); 

newWords 배열이 새 배열이됩니다 '. 하드 코드하지 마십시오 – Baby

답변

0

당신은 inputCount 루프 동안 끝없는 캡슐화의 카운트가 어디

Arrays.sort(words, 0,inputCount, String.CASE_INSENSITIVE_ORDER); 

를 사용하여 inputed 값 및 정렬 단지 null 이외의 값을 계산 할 수있다.


또한 수정할 수 있습니다 당신의 당신은 실제로 입력 얼마나 많은 문자열을 추적하는 ArrayList 또는 Set (또는 다른 동적으로 크기 조정 모음)을 사용할 수에 대한 루프

for (int a = 0; a < inputCount; a++) { 
+0

배열을 정렬하지만 실제로는 오랜 시간 동안 을 울립니다. –

+0

감사합니다. 나는 내 대답을 수정했다. – Marcinek

+0

실제로 words.inputCount를 i로 대체했습니다. 아직도 작동합니다. 그리고 대단히 감사합니다! –

0

.

사전 생성 된 배열을 사용하려면 실제로 읽은 행 수를 계산하고 그 값까지 루프 만 생성하면됩니다.

문자열을 입력 할 때 이진 삽입 정렬을 사용할 수 있습니다. 이렇게하면 중복 된 항목을 더 빠르게 검색 할 수 있으며 정렬 된 목록을 출력 할 준비가됩니다.

많은 옵션이 있지만 좋은 것은 아닙니다. 사용자가 50000 개의 스팟을 가지고 있기 때문에 사용자가 스팟을 하나 더 입력하려고하면 어떻게됩니까?

+0

나는이 일을하는 방법을 거의 알아 냈다. 얼마나 많은 Null이 아닌 값이 배열에 있는지 계산할 수 있습니까? –

+0

Java 8을 사용하는 경우 @unableToCompile :'java.util.Arrays.stream (words) .filter (x -> x! = null) .count())'; –

+0

당신은 얼마나 많은 단어가 저장되었는지를 기억할 가치가 있습니다. 루프에서 단어를 읽고 있기 때문에 루프를 완료 할 때마다 그 값을 증가시킵니다. – Tawnos

0

java.util.Set을 사용하여 단어를 저장할 수 있습니다. 그렇게하면 배열을 초기화하거나 확장 할 필요가 없습니다. 대신 당신의 세트에서 null 값에 대한 걱정의

0

는, 이런 식으로 생각 :

  • 하나 null이 아닌 값 하나 개의 null 값, null 이외의 값의 승리에 대해 비교하는 경우.
  • 두 개의 null이 아닌 값과 비교할 경우 어느 쪽도 승리하지 않습니다.

사용자 지정 Comparator<String>을 만들고 Arrays#sort에서 사용할 수 있습니다. 제쳐두고, String.CASE_INSENSITIVE_ORDERComparator<String>이지만, 당신이 가지고있는 것처럼 보이지는 않습니다.

public class NullAwareStringComparator implements Comparator<String> { 

    @Override 
    public int compare(String o1, String o2) { 
     if (o1 == null && o2 == null) { 
      return 2; 
     } else if (o1 == null) { 
      return 1; 
     } else if (o2 == null) { 
      return -1; 
     } else { 
      return o1.compareToIgnoreCase(o2); 
     } 
    } 
} 

당신은 다음과 같은 그것으로 당신의 정렬 방법을 부를 것이다 : :

Arrays.sort(words, new NullAwareStringComparator()); 

이 배열의 끝에서 null 모든 값을두고

여기에 구현 한 예입니다. 역 순서를 원할 경우 compare 메소드에서 반환 된 숫자의 부호를 반전하십시오. 당신이 모르는 경우 또는

이/당신이 대신 TreeSet<String> 사용을 고려 저장할 수있는 얼마나 많은 요소 신경 -이 중복 된 항목을 무시의 추가 혜택을했다. 비교기 대신 같은

Set<String> sortedStrings = new TreeSet<>(new NullAwareStringComparator()); 

또한 사용할 수를 String.CASE_INSENSITIVE_ORDER

,이 시점에서, 당신은하지 거의 걱정 null에 대한 항목을 이전했다으로있어 이후 :

Set<String> sortedStrings = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); 
을 ... 그리고 정렬 컬렉션에 전화 하시려면 Collections.sort()으로 전화하십시오.

1

size이 확실하지 않은 경우 ArrayList을 사용하십시오. 그것을 하드 코드하지 마라. 당신이 array를 사용하는 고집

, 당신은 무엇을 시도 할 수 있습니다 : 널 (null)이`ArrayList`을

관련 문제