2014-11-07 6 views
0

나는 알파벳순으로 이미 이름 목록이있는 읽은 텍스트 파일을 가지고 있습니다. 각 이름을 읽고 새 파일에 이름의 길이로 알파벳 순서로 넣고 싶습니다.여러 개의 주문으로 파일 읽기/쓰기

원본 파일을 읽고 새로 만든 파일에 이름을 넣는 데 문제가없는 것 같습니다.

그러나, 나는 필요 알파벳 순서로 길이 2의 다음

  • 이름
  • 다음
  • 3 등을 나열하는 하나의

    • 모든 이름의 길이는.

    내가 지금 가지고있는 코드는 원하는 길이의 모든 올바른 이름을 가져 오지만, 읽는 파일에 나타나는 순서대로 모든 이름을 넣습니다. 내 질문은 : 길이 1의 모든 이름을 나열한 다음 모든 길이 2를 순서대로 나열하는 방법은 무엇입니까?

    또한 배열과 관련하여 사용할 수 없습니다.

    This is what I get in the newly created file from the code i have. 
    
    A 
    Al 
    B 
    Bo 
    C 
    D 
    E 
    Ed 
    F 
    G 
    H 
    I 
    J 
    Jo 
    K 
    L 
    Lu 
    M 
    N 
    O 
    P 
    R 
    S 
    T 
    Ty 
    V 
    W 
    Wm 
    
    import java.io.*; 
    import java.util.*; 
    public class Lab11 { 
        public static Scanner input = new Scanner (System.in); 
        public static void main (String[] args) throws FileNotFoundException { 
         Scanner fileInput = new Scanner(new File("names.txt")); 
         PrintStream fileOut = new PrintStream(new File("results.txt")); 
         int count1 = 0; 
         int count2 = 0; 
         int sum = 0; 
         while (fileInput.hasNext()) { 
         String name = fileInput.next(); 
         count1++; 
         if (name.length() == 1) { 
          count2++; 
          fileOut.println(name); 
         } 
         if (name.length() == 2) { 
          fileOut.println(name); 
         } 
         while (fileInput.hasNextInt()) { 
          sum += fileInput.nextInt(); 
         } 
         } 
         System.out.println(count1); 
         System.out.println(count2); 
        } 
    } 
    
  • +0

    길이에 따라 올바른 순서이지만 알파벳 순서가 아닌 문제가 있습니까? – ChiefTwoPencils

    +0

    파일에있는 내용과 기대하는 결과를 보여 주실 수 있습니까? 클래스 이름'Lab11'은 이것이 숙제임을 가리 킵니다. 그러나 당신이 설명하려고 시도한 것은 클래스의 솔루션 (맵, 세트, ​​정렬 등)에 필요한 도구를 실제로 사용하지 않는 한 조금 복잡하게 보입니다. – Radiodef

    +0

    그래서 내가 원하는 것은 길이 1의 모든 이름을 새 파일에 먼저 추가 한 다음 길이 2의 모든 이름을 추가하는 것입니다. 알 수 있듯이 알파벳순이지만 순서대로 정렬되지는 않습니다. – istrikeanywhere

    답변

    0
    나는 String 값을 비교하기 전에 길이 (들)을 비교하는 사용자 정의 Comparator<String> 구현하여 시작할 것

    그런

    static class StringLengthComp implements Comparator<String> { 
        @Override 
        public int compare(String o1, String o2) { 
         if (o1 == null) { 
          if (o2 != null) { 
           return -1; 
          } 
          return 0; 
         } else if (o2 == null) { 
          return 1; 
         } 
         int r = Integer.valueOf(o1.length()).compareTo(o2.length()); 
         if (r != 0) { 
          return r; 
         } 
         return o1.compareTo(o2); 
        } 
    } 
    

    같은 (실제로는, 그것은뿐만 아니라 null을 처리하는 것이 좋습니다)을 List<String>에 값을 저장하고 Collections.sort(List, Comparator)을 사용하고 실행 후 파일로 인쇄 할 수 있습니다. 또한, 나는 당신이 알파벳 순서로 인쇄하기 위해

    public static void main(String[] args) { 
        try (Scanner fileInput = new Scanner(new File("names.txt")); 
          PrintStream fileOut = new PrintStream(new File("results.txt"));) { 
         int sum = 0; 
         List<String> names = new ArrayList<>(); 
    
         while (fileInput.hasNext()) { 
          String name = fileInput.next(); 
          names.add(name); 
          while (fileInput.hasNextInt()) { 
           sum += fileInput.nextInt(); 
          } 
         } 
         Collections.sort(names, new StringLengthComp()); 
         for (String name : names) { 
          fileOut.println(name); 
         } 
        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } 
    } 
    
    +0

    슬프게도 우리 수업에 아직 사용하지 않았기 때문에 배열을 사용할 수 없습니다. – istrikeanywhere

    0

    같은 try-with-resources를 사용하는 것이 좋습니다, 당신은 당신이있어 얼마나 많은 이름을 알고있는 경우 (데이터 구조에있는 모든 이름을 유지하기 위해 필요 해요 어레이를 사용하고 얼마나 많은 이름을 갖고 있는지 모르는 경우 배열 목록을 사용하십시오.

    일단 모든 파일을 컨테이너에 저장 한 후에는 다시 정렬하여 정렬해야합니다 (이 작업을 수행하는 방법에는 여러 가지가 있습니다 - 가장 간단한 버블 정렬이 있습니다. 정렬 및 빠른 정렬).

    마지막으로 일단 모두 정렬되면 목록에서 x 번 반복되는 루프를 수행합니다. 여기서 x는 목록에서 가장 긴 문자열의 문자 중 가장 긴 문자입니다. 목록을 읽을 때마다 특정 길이의 문자를 인쇄하십시오.

    +0

    슬프게도 나는 클래스에서 아직 배웠지 않았기 때문에 배열을 사용할 수 없다. 또한 내가 읽었던 원래 파일은 알파벳순으로 모든 이름을 가지고있다. 이름 만 정렬하면됩니다. – istrikeanywhere

    +0

    이 경우 x + 1 번 파일을 반복 할 수 있습니다. 처음으로 최대 길이가 무엇인지 알아 내고 파일을 통과하는 횟수를 결정하는 데 사용합니다. for (int i = 0; i

    +0

    와우는 실제로 많은 의미가 있습니다. 난 그냥 내 whileNext 후에 for 루프를 넣을까요? – istrikeanywhere