0

配列値をコンストラクターに渡す際に問題があります。file.txtたとえば、次のような値を持つ行を含む があります。

ピーター|ベルリン|ドイツ|0930295235|フー。

行を配列に変換する方法を見つけました。しかし、配列からコンストラクターに値を渡して、配列を配列属性を持つオブジェクトに変換する方法がわかりません。

メインクラスは次のとおりです。

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;


public class FileReader {

    public static void main(String[] args) {
        try {
            // Open the file that is the first 
            // command line parameter
            FileInputStream fstream = new FileInputStream("file.txt");
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;

            // Read the file line by line
            while ((strLine = br.readLine()) != null) {
                // Print the content on the console
                String s[] = strLine.split("\\|");
                // System.out.println(java.util.Arrays.toString(s));
                // System.out.println (strLine);
                for (String element : s) {
                    System.out.println(element);
                    // HERE I NEED TO PASS THE ARRAY VALUES FOR EACH LINE TO TRANSFORM THE ARRAYS TO OBJECTS
                    Item item = new Item(element,element,element,element,element);
                    System.out.println("*************************************");
                }
                // Close the input stream
                in.close();
            } catch (Exception e) { //Catch exception if any
                System.err.println("Error: " + e.getMessage());
        }
    }
}

クラスアイテムは次のとおりです。

public class Item {

    private String name;
    private String city;
    private String state;
    private String number;
    private String foo;

    public Object(String name, String city, String state, String number,String foo){
        this.name = name;
        this.city = city;
        this.state = state;
        this.number = number;
        this.foo = foo; 
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
}

データをさらに操作するためのオブジェクトが必要です。助けていただければ幸いです。

4

6 に答える 6

2

あなたがやりたいことは、完全には明らかではありませんが、次のようなものだと思います。

String s[] = strLine.split("\\|");
Item item = new Item(s[0], s[1], s[2], s[3], s[4]);

また、新しいItemオブジェクトを作成した後、すぐにスコープ外になるため、whileループの外で宣言された何らかのコンテナに格納する必要があることに注意してください。

List<Item> items = new ArrayList<Item>();
String line;

while((line = br.readLine()) != null) {
    String[] words = line.split("\\|");
    Item item = new Item(words[0], words[1], words[2], words[3], words[4]);
    items.add(item);
}
于 2012-11-23T11:55:11.147 に答える
1

Objectそこにforループを設定する必要はありません。まず、適切な数の値があることを確認して、各配列値をsコンストラクターに渡します。newObjectはすでにJavaで使用されているので、クラスを呼び出します(オブジェクトとクラスの違いを覚えておいてください)MyObj

MyObj myObj = null; // De
String s[] = strLine.split("\\|");
if (s.length==5){
  myObj = new MyObj(s[0],s[1],s[2],s[3],s[4]);
} else {
  System.err.println("Wrong number of arguments on the line"+strLine);
}

パラメータのないコンストラクタを使用してから、各フィールドを次のように設定するのは明らかかもしれません。

myObj = new MyObj();
myObj.setName( s[0]); //etc

どのデータがどのフィールドに入るのか、どちらが少し読みやすいですか

于 2012-11-23T11:58:51.197 に答える
1

forこのループは必要ないと思います。

for(String element : s)
{
}

String配列から特定の s を抽出する場合は、次のようなものを使用する必要があります。

String name = s[0];

ただし、配列の範囲外の項目を選択しないように注意してください。

于 2012-11-23T11:54:28.687 に答える
1
String s[] = strLine.split("\\|");
Object item = new Object(s[0],s[1],s[2],s[3],s[4]);
于 2012-11-23T11:56:55.010 に答える
0

for ループを次のように変更してはどうでしょうか。

for(int i=0;i<s.size();i+=5) {
      System.out.println(s[i]);
      Object item = new Object(s[i],s[i+1],s[i+2],s[i+3],s[i+4]);
 }

ただし、これは「s」のサイズが 5n の形式であることを前提としています。n は 1、2、3 です...

于 2012-11-23T11:54:34.087 に答える
0

file.txtの構造、つまりの長さがわかっているので、String[] s持っている配列の各要素を呼び出すことができます。

for (String element : s) {
    System.out.println(element);
    Item item = new Item(s[0], s[1], s[2], s[3], s[4]);
}

sを保存Item itemし、ループ内の次の要素で上書きしないようにするために、アイテムを含む配列に保存できます (配列の宣言から始めます)。

public static void main(String[] args) {
    try {
        ArrayList<Item> items = new ArrayList<Item>();
        ...

その後

for (String element : s) {
    System.out.println(element);
    Item item = new Item(s[0], s[1], s[2], s[3], s[4]);
    items.add(item);
}
于 2012-11-23T12:02:14.360 に答える