1

私はこのコードを実行してきましたが、テキスト ファイルを適切に分割する方法に行き詰まっています。どうすればこれを行うことができますか?テキストファイルからの読み取り中に、2次元配列を使用しています。

Scanner sc= new Scanner (System.in);
    int entry;
    String hockeyStats[][] = new String[8][30];//Array initialized, up to 30 players in total can be in the database.
    BufferedReader input = new BufferedReader (new FileReader ("Vancouver Stats.txt"));//Text file with player names imported.
    // FULL NAME, GOALS, ASSISTS, PLUSMINUS, PENALTY MINUTES, SHOTS
    String listnumbers="word";
    while (listnumbers!=null)
    {
        for (int x=0; x<30;++x)
        {
            listnumbers=input.readLine();
            String temp[]=listnumbers.split(" ");
            for (int y=0; y<7;++y)
            {
                hockeyStats[x][y]=temp[y];
            }

        }
    }
    input.close();

どうすればいいですか?ここの問題がわかりません。ここに、私のテキスト ファイル、Vancouver Stats の内容を示します。

Kesler Ryan 22 27 11 56 222
Sedin Henrik 14 67 23 52 113  
Edler Alexander 11 38 0 34 228 
Hansen Jannik 16 23 18 34 137 
Hamhuis Dan 4 33 29 46 140  
Tanev Christopher 0 2 10 2 15  

これらのデータ セットを取得して 2D 配列に配置する方法がわかりません。これにより、並べ替え、プレーヤーの検索、追加などを行うかどうかをユーザーに尋ねることができます。

誰かが私を助けてくれたら、ありがとう!

4

4 に答える 4

1

次のコードを使用して、テストファイルを読み取り、データを管理できます。

 try {
            File file=new File("asd.txt");
            Scanner sc=new Scanner(file);
            /*
             * If Players name are unique
             */
            Map<String,ArrayList> mPlayerData=new HashMap();
            ArrayList mData=new ArrayList();

            while(sc.hasNext()){
                 String mPlayerName="";
                 Scanner sc2=new Scanner(sc.nextLine());
                 sc2.useDelimiter(" ");
                 int i=0;
                 while(sc2.hasNext()){
                     if(i<2){
                         mPlayerName=mPlayerName.equalsIgnoreCase("")?sc2.next():mPlayerName+" "+sc2.next();
                     }else{
                         mData.add(sc2.next());
                     }
                     i++;
                 }
                 mPlayerData.put(mPlayerName, mData);
            }
            System.err.println(mPlayerData.size());
        } catch (FileNotFoundException ex) {
            Logger.getLogger(JavaApplication1.class.getName()).log(Level.SEVERE, null, ex);
        }

楽しみ......

于 2013-01-11T20:41:21.100 に答える
0

これが私に起こる問題です。

String hockeyStats[][] = new String[8][30];

後で参照するのは次のとおりであることを考えると、ここでは寸法が後方にあるように見えます。

hockeyStats[x][y]

で30を超えるプレーヤーを反復しx、で8つの属性を反復しますy。統計配列を宣言する必要がありますnew String[30][8]。問題がだった場合、ArrayIndexOutOfBoundsExceptionそれはそれを解決するはずです。


String listnumbers="word";
//Here, we check for a null value.  Two reasons this isn't working, see the following comments.
while (listnumbers!=null)
{
    //Looping through 30 records, without ever touching the while loop.
    //This attempts to read and add 30 lines, then checks whether listnumbers is null
    //(and if not, adds another 30, etc.)
    for (int x=0; x<30;++x)
    {
        //You might get listnumbers == null here
        listnumbers=input.readLine();
        //And if you do, it will throw an exception here!
        //Note, there is nothing checking for null between those two points.
        String temp[]=listnumbers.split(" ");
        for (int y=0; y<7;++y)
        {
            hockeyStats[x][y]=temp[y];
        }

    }
}

使用できる選択肢がいくつかあります。1つは、whileループを取り除き、代わりにこれを実行することです。

for (int x=0; x<30;++x)
{
    listnumbers=input.readLine();
    if (listnumbers == null) break;
    String temp[]=listnumbers.split(" ");
    for (int y=0; y<7;++y)
    {
        hockeyStats[x][y]=temp[y];
    }
}
于 2013-01-11T19:39:59.460 に答える
0

私はあなたの問題に有効なコードを提供しています。コードは以下の通りです。あなたが間違って実装したことのいくつかを説明しようとします。

  1. hockeyStats[x][y]=temp[y];x8 を超えて進むため、範囲外の例外を取得します。hockeyStatsサイズが 8x30 であることを忘れないでください
  2. String temp[]=listnumbers.split(" ")listnumbers=input.readLine();入力を読み取っていない可能性があるため、null 例外にヒットします。これはファイルの最後で発生します。

    java.io.BufferedReader をインポートします。java.io.FileReader をインポートします。import java.io.FileNotFoundException; import java.io.IOException;

    public class vvvd {
    
    public static void main(String[] ards ) throws FileNotFoundException, IOException{
    //Scanner sc= new Scanner (System.in);
    int entry;
    String hockeyStats[][] = new String[8][30];//Array initialized, up to 30 players in total can be in the database.
    BufferedReader input = new BufferedReader (new FileReader ("Vancouver.txt"));//Text file with player names imported.
    // FULL NAME, GOALS, ASSISTS, PLUSMINUS, PENALTY MINUTES, SHOTS
    String listnumbers="word";
    
    listnumbers=input.readLine();
    int x = 0;
    while (listnumbers!=null)
    {
        //for (int x=0; x<8;++x)
        //{
    
          if(x >= 8)
              break;
    
            String temp[]=listnumbers.split(" ");
            for (int y=0; y<7;++y)
            {
                hockeyStats[x][y]=temp[y];
            }
    
        //}
      x++;
     listnumbers=input.readLine();
    }
    input.close();
    

    }

于 2013-01-11T20:04:25.293 に答える
0

保守性のために、物事を単純化するために私たちができることは、統計保持者のために便利な構造体のようなクラスを作成することです。

static class HockeyPlayer extends Comparable<HockeyPlayer>
{
    static final int VALUES_LENGTH = 5;  //we like knowing how many stats we should be handling
    String lastName;
    String firstName;
    int[] values;

    /**
     * Creates a data structure holding player data of hockey stats
     * @throws FormatException 
     *     when the data passed in does not have enough values stored or if 
     *     the stats could not be parsed into integers
     */
    public HockeyPlayer(String data) throws FormatException
    {
        String[] parsedData = data.split();
        if (data.length != 2 + VALUES_LENGTH)
        {
            throw new FormatException();
        }
        lastName = parsedData[0];
        firstName = parsedData[1];
        values = new int[VALUES_LENGTH]
        // we use two counters, one for the parsed data index and 
        // another for the values index
        for (int i = 0, j = 2; i < values.length; i++, j++)
        {
            //make sure the numbers are parsed into int
            values[i] = Integer.parseInt(parsedData[j]);
        }
    }

    /**
     * Comparison handling method of Comparable objects.  
     * Very useful in sorting
     * @return 0 when equal, -1 when less than, 1 when greater than
     */
    public int compareTo(HockeyPlayer player2)
    {
       //I'll leave this for you to set up since you know how you want your values organized
       return 0;
    }
}

このようにフォーマットされたクラスは、さまざまな理由で非常に役立ちます。まず、行が不適切にフォーマットされている場合、プログラムを壊す代わりに、大量の if ステートメントを実行するよりも簡単にエラーを見つけることができます。これは、行のフォーマットが間違っていることを明示的に示す例外が発生するためです。その上で、比較対象として HockeyPlayer のデータ型を持つ Comparable クラスを実装します。データを に入れると、ArrayList<HockeyPlayer>新しいプレーヤーを簡単に追加したり、 で並べ替えたりできCollections.sort()ます。

名前や統計などの特定のパラメーターで検索するための独自のメソッドを追加する必要がありますが、配列の組み立てははるかに簡単になりました。

ArrayList<HockeyPlayer> list = new ArrayList<HockeyPlayer>();

while (input.hasNextLine())
{
    String data = input.nextLine();
    try
    {
       HockeyPlayer player = new HockeyPlayer(data);
       list.add(player);
    }
    catch (FormatException e)
    {
       System.err.println("Player data not formatted correctly");
    }
}

私はいつも、いくつかの構造体を導入することで、あなたのプログラムがどれだけ良くなるのか本当に驚くべきものだと思っています。

于 2013-01-11T23:19:31.043 に答える