2017-01-06 11 views
0

私は与えられた文字列をさまざまなタイプの変数に解析する必要があるクラス割り当てを行っています。さまざまな変数は:氏名、姓、生年月日、生年月日です。これが行われた後、変数Personのコンストラクタに変数を送信する必要があります。文字列を解析してコンストラクタに複数の値を送る方法

3つの異なる値を変数に代入してから、その変数をコンストラクタに返す方法がついています。私は各変数の配列を宣言しようとした後、値を持つforループを埋めていますが、長さを宣言するきちんとした方法を見つけるのが難しくなりました。配列を文字列に変換して渡す必要があると思いますコンストラクタの値と結果のコードは面倒です。これを行う簡単な方法はありますか?

これはコード内の何かを変更するかどうかわかりませんが、値をコンストラクタに渡した後、そのオブジェクトをListコレクションに送信し、それを使用して各自の詳細を出力する必要があります。

public static void main(String[] args) { 

    // Given string to parse 
    String text = "John.Davidson/05051988/Belgrade Michael.Barton/01011968/Krakov Ivan.Perkinson/23051986/Moscow"; 

    String[] parsArray = text.split("[ /.]+"); 

    // Results from parsing 
    for (Object s: parsArray) 
    { 
     System.out.println(s); 
    } 

    for (int i = 0; i<parsArray.length; i+=4) 
    { 
     String firstName = parsArray[i]; 
     String lastName = parsArray[i+1]; 
     String birthPlace = parsArray[i+3]; 
     System.out.println("\nFirst name: " + firstName + "\nLast name: " + lastName + "\nCity of birth: " + birthPlace); 
    }   
} 
} 

クラス人とそのコンストラクタ:

import java.time.LocalDate; 

public class Person { 
String name; 
String surname; 
LocalDate dob; 
String placeOfBirth; 

public Person(String name, String surname, LocalDate dob, String placeOfBirth) 
{ 
this.name = name; 
this.surname = surname; 
this.dob = dob; 
this.placeOfBirth = placeOfBirth; 
} 
} 
+0

* "3つの異なる値を変数に割り当てる方法が残っています" *本当に??あなたのコードはそれを行います。 'String firstName = parsArray [i]'です。あなたはちょうどローカル変数に値を割り当てました。 – Andreas

答えて

0

あなたがオンになっているPersonオブジェクト

DateTimeFormatter dobFormatter = DateTimeFormatter.ofPattern("ddMMuuuu"); 
ArrayList<Person> list = new ArrayList <Person>(); 
for (int i = 0; i<parsArray.length; i+=4) 
    { 
     String firstName = parsArray[i]; 
     String lastName = parsArray[i+1]; 
     LocalDate dob = LocalDate.parse(parsArray[i+2], dobFormatter); 
     String birthPlace = parsArray[i+3]; 
     System.out.println("\nFirst name: " + firstName + "\nLast name: " + lastName + "\nCity of birth: " + birthPlace); 
     list.add (new Person (firstName, lastname, dob, birthPlace)); 
    } 
+0

私は同じ答えを書くつもりだった。希望の編集は大丈夫です。 – Andreas

+0

@Andreasありがとう、私はdobが存在することに気付かなかった。 –

+0

@ ScaryWombatあなたのソリューションを投稿していただきありがとうございます、それは魅力的なように機能しました。私はこの答えを見る前にDateTimeFormatterの部分を終えましたが、それはまだ助けました! ArrayListの基本を説明しましたが、これをすべて単一の単純な行で解決しました。 –

0

を保存するためにArrayListを使ってここで

は私の現在のコードです正しいトラック、bu私は、問題を特定するのに役立つような方法でコードを構造化できれば、さらに進歩を遂げることができると思います。目標は、問題を単純で凝集力のある機能に取り組むのに十分な小片に​​分割することです。彼らの詳細を記入する前に、クラスやメソッドをスケッチするのが好きです。しかし、まずは、まず問題を話すことから始めます。

目的は、1行のテキストを型固有のPersonオブジェクトの集合に変換することです。入力は、レコード区切り文字 '。'を1つのスペースとして使用します。 「/」はスラッシュでレコード内の他のフィールドを区切ります。 Ahhh ...クラシック。

最初の手順は、個々のレコードを処理するテキストのブロックを単離することです。入力テキストについて最初に気づいたのは、スペースを使用してさまざまな人物に関する情報を分離していたからです。 1つのバイトで鯨を飲み込もうとするコードを書こうとする必要はありません。

String[] parseRecords(String input) { 
    return input.split("[ ]+"); 
} 

今のレコードが互いに分離されていることを、我々は唯一つだけの情報が含まれている元の入力のサブセット、すなわち、単一のレコードを含むテキストのブロックから個人レコードを生成する方法を必要とします人。私の問題の記述では、私は両方のことに気づいた。と '/'はフィールド区切り文字として使用されるので、いずれかのフィールドに区切ることができます。この正規表現を書くには他にもたくさんの方法がありますが、私はあなたのアプローチをその質問にコピーしました。

Person parsePersonFromString(String text) { 
    String[] fields = text.split("[./]+"); 
    LocalDate dob = /* something with field[2] */ 
    return new Person(fields[0], fields[1], dob, fields[3]); 
} 

文字列の分割配列の長さが4であることに注意してください。最初の2つのフィールドは、既にString型になっている名前です。同じように都市のフィールドに行く。 Stringがあり、LocalDateが必要なので、日付フィールドは少し厄介です。これは宿題なので、詳細はあなたに残しておきますが、問題に遭遇した場合は、これも簡単な問題に分解することができます。

LocalDate parseDateFromField(String field) { 
} 
+0

私はあなたの徹底した説明を読んで楽しんでいて、「あなたは一度に鯨を飲み込もうとするコードを書く必要はありません。これは私が常にやろうとしているものですが、迷子になる傾向があるので、私はあなたの将来のためのアドバイスを取っていきます。乾杯! –

関連する問題