簡體   English   中英

轉置數組

[英]Transposing arrays

我使用以下代碼讀取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'。 我的應用程序是一個字典類型的應用程序 - 輸入數據的第一列是單詞列表,第二列是這些單詞的定義。 以下是加載的數組的示例:

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

為了訪問數組中的一個字符串,我使用以下代碼:

dataArray.get(rowNumber)[columnNumber]

但是,我需要能夠生成所有術語的列表,以便可以為詞典應用程序顯示它們。 據我所知,訪問列是一個比訪問行更長的過程(我來自MATLAB背景,這將是簡單的)。

似乎為了能夠隨時訪問輸入數據的任何行,我最好轉置數據並以這種方式讀取數據; 即:

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

當然,我可以提供一個首先轉置的CSV文件 - 但Excel或OO Calc不允許超過256行,而我的詞典包含大約2000個術語。

歡迎以下任何解決方案:

  • 一種在讀入數組后轉置數組的方法
  • 對上面發布的代碼進行更改,以便以“轉置”方式讀取數據
  • 一種簡單的方法來讀取整個數組的整個列

使用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();

和第二列

dataMap.values();

請注意這里的一個假設:輸入數據的第一列是所有唯一值(即“Term”列中沒有重復的值)。

為了能夠將鍵(術語)作為數組訪問,您可以按如下方式執行:

String[] terms = new String[dataMap.keySet().size()];
terms = dataMap.keySet().toArray(terms);

如果每一行都有兩個值,第一個是術語,第二個是定義,你可以像這樣構建一個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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM