3

次のコードを使用して CSV ファイルを読み込んでいます。

  String next[] = {};
  List<String[]> dataArray = new ArrayList<String[]>();

  try {
      CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
      for(;;) {
          next = reader.readNext();
          if(next != null) {
              dataArray.add(next);
          } else {
              break;
          }
      }
  } catch (IOException e) {
      e.printStackTrace();
  }

これにより、CSV ファイルが配列「dataArray」に変換されます。私のアプリケーションは辞書タイプのアプリ用です。入力データの最初の列は単語のリストで、2 番目の列はそれらの単語の定義です。読み込まれた配列の例を次に示します。

Term 1, Definition 1
Term 2, Definition 2
Term 3, Definition 3

配列内の文字列の 1 つにアクセスするには、次のコードを使用します。

dataArray.get(rowNumber)[columnNumber]

ただし、辞書アプリケーションで表示できるように、すべての用語のリストを生成できる必要があります。私が理解しているように、列自体にアクセスすることは、行にアクセスするよりもはるかに長いプロセスです (私は MATLAB のバックグラウンドを持っているので、これは簡単です)。

入力データの任意の行にすぐにアクセスできるようにするには、データを転置してそのように読み取る方がよいようです。すなわち:

Term 1, Term 2, Term3
Definition 1, Definition 2, Definition 3

もちろん、最初に転置された CSV ファイルを提供することもできますが、Excel または OO Calc では 256 行を超えることはできず、私の辞書には約 2000 の用語が含まれています。

次の解決策のいずれかが歓迎されます。

  • 読み込まれた配列を転置する方法
  • 「転置された」方法でデータを読み取るように、上記に投稿されたコードの変更
  • 配列の列全体をまとめて読み取る簡単な方法
4

2 に答える 2

3

Map データ構造 (例: HashMap )を使用すると、おそらくより適切なサービスが提供されるでしょう。

String next[] = {};
HashMap<String, String> dataMap = new HashMap<String, String>();

try {
    CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
    for(;;) {
        next = reader.readNext();
        if(next != null) {
            dataMap.put(next[0], next[1]);
        } else {
            break;
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

次に、最初の列にアクセスできます

dataMap.keySet();

および2番目の列

dataMap.values();

ここで 1 つの仮定に注意してください: 入力データの最初の列がすべて一意の値である (つまり、"Term" 列に値が繰り返されていない)。

キー (ターム) に配列としてアクセスできるようにするには、次のようにします。

String[] terms = new String[dataMap.keySet().size()];
terms = dataMap.keySet().toArray(terms);
于 2012-08-26T20:32:11.990 に答える
2

各行に 2 つの値があり、最初の値が用語で、2 番目の値が定義である場合、次Mapのようにそれを作成できます (ちなみに、このwhileループはループとまったく同じことを行いますfor)。

String next[] = {};
Map<String, String> dataMap = new HashMap<String, String>();

try {
    CSVReader reader = new CSVReader(new InputStreamReader(getAssets().open("inputFile.csv")));
    while((next = reader.readNext()) != null) {
        dataMap.put(next[0], next[1]);
    }
} catch (IOException e) {
    e.printStackTrace();
}

次に、次の方法で用語から定義を取得できます。

String definition = dataMap.get(term);

または次のようなすべての定義:

for (String term: dataMap.keySet()) {
    String definition = dataMap.get(term);
}
于 2012-08-26T20:32:30.110 に答える