2012-04-07 4 views
0

그래서 일련의 이메일을 받았고 배열을 읽고 배열에 저장하고 중복을 제거하고 "남은 음식"을 인쇄해야합니다. 나는 거의 이것을 할 수 있지만 중복을 제거한 후에 남은 부분을 인쇄하면 null이 추가로 인쇄됩니다.Java 문자열 루프 배열 Null

여기 내 코드입니다. 누군가 그것을 고치는 방향으로 나를 가리킬 수 있습니까?

public class Duplicate { 
    public static void main(String [] args){ 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Enter file name: "); 
     String fileName = keyboard.nextLine(); 
     if(fileName.equals("")){ 
      System.out.println("Error: User did not specify a file name."); 
     } 
     else{Scanner inputStream = null; 

     try{inputStream = new Scanner(new File(fileName)); 
     } 
     catch(FileNotFoundException e){ 
      System.out.println("Error: "+ fileName + " does not exist."); 
      System.exit(0); 
     } 


     String [] address = new String[100]; 

     for(int i=0;inputStream.hasNextLine();i++){ 
      String email = inputStream.nextLine(); 
      address[i]=email.toLowerCase(); 
      //System.out.println(address[i]); 
     } 


     Set<String> mail = new HashSet<String>(Arrays.asList(address)); 

     for(String email:mail){ 
      System.out.println(email); 
     } 
+0

이전 질문과 마찬가지로 숙제도 들립니다. '숙제'태그를 꼭 사용하십시오. – Leigh

답변

5

나는 100 개 미만의 주소를 읽고 있다고 가정합니다. 배열 주소의 나머지 요소는 null입니다. 이것이 null 값의 원인입니다.

ArrayList<String>으로 고정 크기 어레이를 장착 :

List<String> address = new ArrayList<String>(); 
//... 
    address.add(email.toLowerCase()); 
    // ... 

는 또한 세트의 구성을 교체해야

Set<String> mail = new HashSet<String>(address); 
+0

이렇게해도 최대 100 개의 주소를 읽을 수 있습니까? 무작위로 <100을 테스트 할 것이기 때문입니다. –

+0

별로 좋지 않다. get go에서'Set'을 사용하고 copy-to-set 코드를 제거한다. – Bohemian

+0

그렇다. Nosid가 자리에 있지만 Array/ArrayList를 사용하는 대신 Set을 즉시 사용하지 않는 이유는 무엇입니까? 스트림에서 읽기 전에 세트를 만들고 세트에 주소를 추가하십시오. –

3

당신은 고정 된 수의 판독하려는을 [100] 요소 중 파일.

보다 이메일이있는 경우, 당신은 일부를 그리워합니다 덜이있는 경우 - 당신은 [하나 nullSet 붕괴 것] 왼쪽 일부 null들 것이다.

+0

+1 : 우리가 처음부터 '세트'만 할 이유는 없습니다. – unholysampler

1
String [] address = new String[100]; 

변화

SortedSet<String> address = new TreeSet<String>(); 

address[i]=email.toLowerCase(); 

변화 .. 배열 대신 ArrayList을 사용하여, 또는 제 1 위치에서 Set을 사용하여 시도

address.add(email.toLowerCase()); 
0

그냥 이렇게 :

Set<String> addresses = new HashSet<String>(); // use a Set 

while (inputStream.hasNextLine()) { 
    addresses.add(inputStream.nextLine().toLowerCase()); // in-line unused variable 
} 

for (String email : mail) { 
    System.out.println(email); 
} 
0

이 코드와 몇 가지 문제가 있습니다.

  • 나는 스캐너를 사용하여 거의 읽지 않고 본 적이없는 파일을 읽습니다. FileInputStream 클래스는 그 목적에보다 최적화되어 있습니다.

  • 귀하는 루프 반복의 알려지지 않은 번호의 대 루프를 사용하여 문자열

  • 미지의 번호를 저장하는 고정 크기 어레이를 사용한다. 이것은 잘못된 것은 아니지만 while 루프가 더 적절합니다.

  • 배열에서 새 HashSet을 만듭니다. 다시는 잘못된 것은 아니지만 루프에서 HashSet을 사용하지 않은 이유는 무엇입니까? 당신은 색인을 모두 사용하는 것을 피했을 것입니다.

나는 수동으로하고 싶지 않은 것을 자동화하기위한 코드를 작성한 초보 프로그래머라고 가정합니다.모든 String 객체가 어쨌든 귀하의 경우 고유성을 보장받을 수 있습니다으로 과정의 잘못 아무것도, 그 경우, 그냥 ArrayList에 사용하지 :

public class Duplicate { 
public static void main(String [] args){ 

Scanner keyboard = new Scanner(System.in); 
System.out.println("Enter file name: "); 
String fileName = keyboard.nextLine(); 
if(fileName.equals("")){ 
    System.out.println("Error: User did not specify a file name."); 
} 
    else{Scanner inputStream = null; 

try{inputStream = new Scanner(new File(fileName)); 
} 
catch(FileNotFoundException e){ 
    System.out.println("Error: "+ fileName + " does not exist."); 
    System.exit(0); 
} 


ArrayList<String> addresses = new ArrayList<String>(); 

for(int i=0;inputStream.hasNextLine();i++){ 
    String email = inputStream.nextLine(); 
    address.add(email.toLowerCase()); 
    //System.out.println(email); 
} 

for(String email:addresses){ 
    System.out.println(email); 
} 

을 적절한 수입과 함께. 참고 : 이는 최소한의 변경으로 해결할 수있는 몇 가지 사항이 있습니다 (위 참조). 행운을 빕니다!