因此,对于我正在处理的程序,我正在尝试创建一个解析文本文件的方法。使用文本文件中的值,在ArrayList
内创建ArrayList
。到目前为止,这是我的代码:
public ArrayList<ArrayList<String>> getRels(String relsFile)
{
String[] currentId;
int i = -1;
ArrayList<ArrayList<String>> relsList = new ArrayList<ArrayList<String>>();
relsList.add(new ArrayList<String>());
try
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream(relsFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null)
{
// Add values to array list
currentId = strLine.split(",");
relsList.get(++i).add(currentId[0]);
//???????????
}
//Close the input stream
in.close();
}
catch (Exception e)
{
System.err.println("Error: " + e.getMessage());
}
return relsList;
}
这是我正在查看的文本文件的示例。
rId13,image3
rId18,image8
rId26,image16
rId39,image29
rId21,image11
rId34,image24
rId7,image1
rId12,image2
rId17,image7
rId25,image15
rId33,image23
rId38,image28
rId16,image6
rId20,image10
rId29,image19
rId24,image14
rId32,image22
rId37,image27
rId15,image5
rId23,image13
rId28,image18
rId36,image26
rId19,image9
rId31,image21
rId14,image4
rId22,image12
rId27,image17
rId30,image20
rId35,image25
基本上,我希望能够分割值,将所有rId
值存储在第一个ArrayList
中,然后在嵌套image
中列出相应的ArrayList
值}。但是,我有点卡住,不知道该做什么。有人可以帮帮我吗?我感谢您提供的任何帮助。
答案 0 :(得分:5)
我建议你使用调试器来确切了解发生了什么。
通过阅读代码,我猜它会读取第一行,但在此之后失败,因为您只添加了一个嵌套的ArrayList,但尝试使用其中的许多。
最简单的方法是返回Map&lt; String,String&gt;因为我认为第一列是独一无二的。
public static Map<String, String> getRels(String relsFile) {
Map<String, String> map = new LinkedHashMap<String, String>();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(relsFile));
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(",", 2);
if (parts.length > 1)
map.put(parts[0], parts[1]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
} catch (IOException ignored) {
}
}
return map;
}
答案 1 :(得分:3)
创建两个arraylists。填充它们然后将它们添加到您的其他arraylist中。
话虽如此,这是否必须是一个arraylist?难道你不能只有一个包含两个不同的arraylists的常规对象吗?更好的是,您可能想要考虑一种不同的数据结构,如Map?
try
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream(relsFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
while ((strLine = br.readLine()) != null)
{
// Add values to array list
currentId = strLine.split(",");
list1.add(currentId[0]);
list2.add(currentId[1]);
}
//Close the input stream
in.close();
relsList.add(list1);
relsList.add(list2);
}
答案 2 :(得分:1)
我认为执行此任务的更好方法是使用任何现有库来读取CSV文件。这将使您的代码更简单。
答案 3 :(得分:1)
我同意Peter L--绝对使用Map实现。我使用TreeMap进行测试,因为它是一个有序的Map,但你可以使用你想要的Map。我也对此进行了测试以确保它有效。
根据您的描述,我相信这就是您想要的:
public TreeMap<String, ArrayList<String>> getRels(String relsFile)
{
String[] currentId;
int i = -1;
TreeMap<String, ArrayList<String>> relsList = new TreeMap<String, ArrayList<String>>();
try
{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream(relsFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null)
{
// Add values to array list
currentId = strLine.split(",");
if(relsList.containsKey(currentId[0])) {
relsList.get(currentId[0]).add(currentId[1]);
} else {
relsList.put(currentId[0], new ArrayList<String>());
relsList.get(currentId[0]).add(currentId[1]);
}
}
//Close the input stream
in.close();
}
catch (Exception e)
{
System.err.println("Error: " + e.getMessage());
}
return relsList;
}
public static void main(String[] args) {
ListReader lr = new ListReader();
TreeMap<String, ArrayList<String>> l = lr.getRels("test.txt");
for(String s : l.keySet()) {
for(String k : l.get(s)) {
System.out.println("Key: " + s + " Value: " + k);
}
}
}
我在解析部分所做的是使用简单的IF ... ELSE语句解析文件。它检查密钥是否已经存在(rId部分),如果确实存在,它只是将右边的值添加到现有的ArrayList中。如果没有,它会添加一个新密钥,然后创建一个ArrayList,然后将该值添加到。
希望这就是你想要的!