2016-05-09 19 views
0

Javaのテキストファイルの行を比較しようとしています。Javaのテキストファイルから行ごとに比較

TEMP1は32.5午後33.5
TEMP2が33.5午後33.5
TEMP3は32.5午後 33.5
TEMP4は31.5午後35

をアムアム:たとえば は、これらの行を含むテキストファイルがありますABCDE

Bが一定で、ラインの名前である(AM)、CDは定数(PM)は、可変であり、Eは別の変数です。

それが唯一の変数を比較する - TEMP2(E)にTEMP2に> TEMP1(C)(C)、TEMP1(E)等

同じC(S有する2本の以上のラインが存在する場合)とe(s)を受け取ると、FormatExceptionがスローされます。

上記の例のテキストファイルから、temp1のcはtemp3のcと同じで、temps1のeはtemp3のeと同じであるため、FormatExceptionがスローされます。

これは私がこれまで持っているものです。

public static Temp read(String file) throws FormatException { 
     String line = ""; 
     FileReader fr = new FileReader(fileName); 
     Scanner scanner = new Scanner(fr); 

     while(scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      System.out.println(line); 
     } 
     scanner.close(); 

     if() { 
      throw new FormatException("Error."); 

は、どのように私はこれを行うことができますか?

+0

によって反復行があなたの質問です広すぎるとあなたのためのコードを書くための要求として解釈される可能性があります。しかし、とにかく、あなたは 'split()'を使ってその行を単語に分解し、チェックしたい単語をいくつかのリストに格納する必要があります。 – rghome

答えて

1

私は私はあなたが始めましょう、あなたのために宿題をしたくないので:

while(scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    String[] partials = line.split(" "); 

    String a = partials[0]; 
    //... 
    String e = partials[4];  
} 

これはあなたの中に分割する唯一のものであると私はspace上の行を分割しています場合。これにより、5つの別々の文字列(a〜e)が得られます。後の分析のためにそれらをString[][]に保存する必要がありますが、これを行う方法を自分で把握できるはずです。

あなたがまだ立ち往生している場合は、これを試してみて、質問を更新してください。

3

あなたは次のように重複をチェックするためにあなたの変数とSetを抽出するために、あなたの行を分割する必要があります。

ここ
Set<String> ceValues = new HashSet<>(); 
while(scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    String[] values = line.split(" "); 
    if (!ceValues.add(String.format("%s %s", values[2], values[4]))) { 
     // The value has already been added so we throw an exception 
     throw new FormatException("Error."); 
    } 
} 
0

あなたは、基本的に例だ:

  • をコレクション内をあなたのラインを保存する
  • 単純なパターンマッチングロジック
  • a私はそれぞれの行を検証してからデータを抽出するためのパターンが必要になります

    public class LineInfo { 
        private String lineName; 
        private String am; 
        private String pm; 
    
        public LineInfo(String lineName, String am, String pm) { 
         this.lineName = lineName; 
         this.am = am; 
         this.pm = pm; 
        } 
    
        // getters and setters 
    } 
    

    第二:0声明は

  • 再帰的なチェックは、メソッドのすべての

まず私は、ライン情報を表す簡単なPOJOになるだろう彼らは:

//         group 1   group 2 group3   group 4 group 5 
//          v    v v     v v 
private static final String LINE_REGEX = "(\\w+)\\s+am\\s+(\\d+(\\.\\d+)?)\\s+pm\\s+(\\d+(\\.\\d+)?)"; 
private static final Pattern LINE_PATTERN = Pattern.compile(LINE_REGEX); 

第三に、私はこのようなread方法を手直しでしょう(私は簡単にするためvoid返す):

public static void read(String fileName) throws FormatException { 
    // collect your lines (or better the information your lines provide) in some data structure, like a List 
    final List<LineInfo> lines = new ArrayList<>(); 

    // with this syntax your FileReader and Scanner will be closed automatically 
    try (FileReader fr = new FileReader(fileName); Scanner scanner = new Scanner(fr)) { 

     while (scanner.hasNextLine()) { 
      final String line = scanner.nextLine(); 
      final Matcher matcher = LINE_PATTERN.matcher(line); 

      if (matcher.find()) { 
       lines.add(new LineInfo(matcher.group(1), matcher.group(2), matcher.group(4))); 
      } else { 
       throw new FormatException("Line \"" + line + "\" is not valid."); 
      } 
     } 

     // recursive method 
     compareLines(lines, 0); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
     // or handle it in some way 
    } 
} 

private static void compareLines(List<LineInfo> lines, int index) throws FormatException { 
    // if there are no more lines return 
    if (index == lines.size()) { 
     return; 
    } 

    final LineInfo line = lines.get(index); 
    for (int i = index + 1; i < lines.size(); i++) { 
     final LineInfo other = lines.get(i); 
     // do the check 
     if (line.getAm().equals(other.getAm()) && line.getPm().equals(other.getPm())) { 
      throw new FormatException(String.format("Lines #%d (%s) and #%d (%s) does not meet the requirements.", 
        index, line.getLineName(), i, other.getLineName())); 
     } 
    } 

    // do the same thing with the next line 
    compareLines(lines, index + 1); 
} 
0

私は右、あなたの質問を得た場合は、行、重複がこの手段の基準

としてCとEを使用して見つけるためにラインごとにチェックする必要があるのn他のすべての行に対して比較されなければなりません、繰り返しならば、例外...

の提案は次のようになります。

は...

のすべての行の要素CとEを表すクラスを定義します0

その後、すべての行を挿入および/または要素があるかそうでないかどうかをチェックされます、そのクラスのリスト。..

List<LinePojo> myList = new ArrayList<LinePojo>(); 

その後、ライン

while(scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    String[] lineInfo = line.split(" "); 
    LinePojo lp = new LinePojo(lineInfo[2], lineInfo[4]); 
    if (myList.contains(lp)) { 
     throw new IllegalArgumentException("there is a duplicate element"); 
    } else { 
     myList.add(lp); 
    }  
} 
+0

私は何も解析しないので、なぜこのクラスが "LineParser"と呼ばれるのだろうかと思います。リストの代わりにSetを使用することもできます。リスト内で検索するのが唯一の目的です。 – Tom

+1

コメントありがとう@Tom、私の第1のアイデアは解析されました。今はpojoに改名されました –

関連する問題