0

まず第一に、このフォーラムのすべての資料と、さまざまなメンバーが私に与えてくれたすべての支援を通じて、自分自身が急速に改善していることに気付いているので、この fourm に感謝したいと思います。ですから、これはすべてのことに大きな感謝です。私の質問に関しては、入力出力を試していて、このロジックが機能するかどうかを確認したかったのです。私は適切なものを適切な配列に入れようとしていますが、このロジックがそれを行うかどうかを確認したかったのです。現在(そしてしばらくの間)、仮想 IDE に効果的にアクセスできる場所にいないので、メモ帳や単語などを使用してその場ですべてを行っていまし。私が最も心配しているのは、ロジック (それが機能するかどうか) であり、コードの重大なミスはそれほどではありません。*

どうもありがとう。

基本的に、テキストファイルは次のようになります。タイトル、1 行のスペース、名前、年齢、賃金、区切り記号は # です。次に、そのすぐ下に、名前、年齢、賃金の区切り記号を # などにします。

(Bobby、Sandy、Roger、Eric、David の間に行間がないふりをします..txt ファイルでは、それらが互いの真下にあるふりをしますが、情報と bobby の間にギャップがあります。

情報


ボビー#24#5.75

サンディ #19#10.22

ロジャー #27#6.73

エリック#31#8.99

David#12#3.50**

これが私が思いついたロジックです。

public class Practice {

    public static void main(String[] args) throws Exception {

        String Name [] = new String [5];
        int Age [] = new int [5] ;
        double Wage [] = new double [5];
        String Blank [] = new String [5];   

        FileReader inputfile = new FileReader (new File(info.txt));

        BufferedReader InputBuffer = new BufferedReader (inputfile);

        String Title = InputBuffer.readline (); // to get the title 

        int count = 0;

        while (InputBuffer.readline() = null) { // this while loop grabs the blank under the title 

            Blank [count] = count;

        }

        int i = 0;

        while (InputBuffer.readline() !=null)  {        

            String Getter = InputBuffer.readline (); // reads line 
            String splitup= Getter.split(#);    // splits it 

            Name [i] = splitup[i];  // puts name in this array
            Age [i] = splitup([i]  + 1); // age in this array 
            Wage [i] = splitup([i]  + 2); // wage in this array 

         }

        InputBuffer.close();
    }
}

このロジックは、タイトル文字列にタイトル、空白配列の下に空白行、名前配列の下に名前、年齢配列の下に年齢、賃金配列の下に賃金を格納するために機能しますか??

どうもありがとう。

PS: 主に最後の while ループについて心配しています。name 配列に名前を、age 配列に年齢を、wage 配列に賃金を入れるかどうかを知りたいです。

4

2 に答える 2

0

まず、必要な while ループは 1 つだけです。特に最初の条件が無意味であるため( )、なぜ2つあるのかわかりませんInputBuffer.readline() = null

ループは次のようになります。

boolean isTitleParsed = false;
String title;
String line;
while ( (line = inputBuffer.readLine()) != null ) {

    if (!isTitleParsed) {
        // this is the title
        title = line;
        isTitleParsed = true;
    } else if (line.isEmpty()) {
        // this is a blank line; logic for dealing with blank lines here
        ...
    } else {
        // this is actual person data
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            String name = personData[0];
            String age = personData[1];
            String wage = personData[2];
            ...
        }
        ...
    }
}

第二に、配列を使用することは完全に間違った方法だと思います。OPに関する彼のコメントで言及されている@AVDのようにList<T>、POJOはおそらくはるかに優れたソリューションであり、はるかに拡張可能です。

そして最後に: いいえ、あなたが書いたように、2 番目のループでは名前、年齢、賃金が配列に正常に保存されません。インクリメントすることはなくi、構文splitup([i] + 1)が間違っています。(あなたはおそらく意味していsplitup[i+1]ました。)

配列の使用

データを保存するために配列を使用することに本当にこだわっている場合は、次のようにする必要があります。

String[] names = new String[5];
String[] ages = new String[5];
String[] wages = new String[5];

...

int index = 0;
while ( (line = inputBuffer.readLine()) != null && index < 5) {

    if (!isTitleParsed) {
      ...
    } else if (line.isEmpty()) {
      ...
    } else {
        // this is actual person data
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            String name = personData[0];
            String age = personData[1];
            String wage = personData[2];

            names[index] = name;
            ages[index] = age;
            wages[index] = wage;
            index++;
        } else {
            System.err.println("Line " + line + " is malformed and was not saved.");
        }
        ...
    }
}

は0indexでインスタンス化されますが、配列に何かを保存するたびにインクリメントされます。この方法でnames[0]は、最初の名前names[1]が保持され、2 番目の名前が保持されます。

また、特定のレコードの名前、年齢、賃金をすべて同じインデックスに保存していることにも注意してください。names[0]したがって、「Bobby」、ages[0]「24」、および「5.75」を保持することが期待できwages[0]ます。これらはすべて同じレコードに関連しています。

最後に、whileループ内の条件が に修正されました(line = inputBuffer.readLine()) != null && index < 5。これは、行がなくなる (ファイルが終了する) か、インデックスが配列をインスタンス化したときのサイズである 5 より大きくなるまで、ファイルの行をループし続けることを意味します。これが、このデータを保持するのに配列が非常に不適切な構造である理由の 1 つです。ファイル内のレコード数を正確に把握する必要があり、最終的にそれらがいっぱいにならない (スペースを割り当てすぎた) か、そうでない可能性があります。レコードを保存するスペースがなくなったため、一部のレコードを保存しています。

POJO の使用

データを保存するより良い方法は、POJO (Plain Old Java Object) を使用することです。この種のオブジェクトは、ほぼ「データ ホルダー」オブジェクトです。

あなたの場合、それは次のようになります:

public class PersonData {
    private String name;
    private String wage;
    private String age;

    public PersonData() {
        this(null, null, null);
    }

    public PersonData(String name, String wage, String age) {
        this.name = name;
        this.wage = wage;
        this.age = age;
    }

    // ... getters and setters here
}

コードでは、配列をオブジェクトのList構造に置き換えます。PersonData

List<PersonData> records = new ArrayList<PersonData>();

while ループでは、配列ではなくこれらのオブジェクトに保存します。

// in the else in the while loop:
String[] data = line.split("#");
if (data != null && data.length == 3) {
    PersonData record = new PersonData(data[0], data[1], data[2]);    
    records.add(record);
} else {
    // error handling for malformed line
}

特定のレコードのデータを取得したい場合は、レコード リストから PersonData オブジェクトを抽出してクエリを実行するだけです。

// assuming the first record we scraped was "Bobby#24#5.75"
PersonData person = records.get(0);
person.getName(); // returns "Bobby"
person.getAge(); // returns 24
person.getWage(); // returns 5.75

配列ではなくリストを使用しているため、ファイル内のレコード数を正確に把握する必要がなく、情報を失うリスクもありません。保管してください。

このようにして、名前、年齢、賃金がすべて同じレコードに関連していることを確実に知ることができますが、これまでは配列のインデックス 0 のすべてのレコードが同じ人物に関連していると期待していました。

また、レコードに追加データを追加する場合 (たとえば、name#age#wage#favorite food)、PersonDataオブジェクトに新しいフィールドを追加し、解析メソッドにそのデータを追加する行を追加するだけです。オブジェクトに。配列を使用していた場合は、新しい配列を追加する必要があります。

たとえば、名前しかない行や賃金がない行などがある場合、ロジックを作成するのもはるかに簡単です。これにより、実際に意味のある方法でデータを保存できます。

于 2012-08-05T05:26:54.640 に答える
0

Java やその他の OOP 言語で良い進歩を遂げたい場合は、常にオブジェクト指向の方法で問題に取り組む必要があります。

当面の問題については、連想配列を使用するのではなく、Person Info を格納するクラスを常に考慮する必要があります。

class PersonInfo {

 PersonInfo(String name,int age,float wage) {
  this.name = name;
  this.age = age;
  this.wage = wage;
 }

String name;
int age;
float wage;

}

コードは上記とほぼ同じですが、PeopleInfo の List を出力として提供する必要があります。

List<PersonInfo> peopleInfo = new ArrayList<String>();
boolean isTitleParsed = false; 
while ( (line = inputBuffer.readLine()) != null ) {

    if (!isTitleParsed) {
        // this is the title
        title = line;
        isTitleParsed = true;
        continue;
    } else if (line.isEmpty()) {
        // this is a blank line; logic for dealing with blank lines here
    } else {
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            peopleInfo.add(new PersonInfo(personData[0],personData[1],personData[2]));
        }

    }
于 2012-08-05T05:57:44.427 に答える