![](/img/trans.png)
[英]How to split element in an ArrayList in multidimensional arrayList
[英]how to work with Multidimensional arraylist?
嘿,对不起,我是Java的新手,但我想做点什么,我需要一个多维数组列表。 必须将其实现为以下代码:
public static void OpenFile() {
ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
int retrival = chooser.showOpenDialog(null);
if (retrival == JFileChooser.APPROVE_OPTION) {
try (BufferedReader br = new BufferedReader(new FileReader(
chooser.getSelectedFile()))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
if (sCurrentLine.equals("")) {
continue;
} else if (sCurrentLine.startsWith("Question")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [0] in array ArrayList
} else if (sCurrentLine.startsWith("Answer")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [1] in array ArrayList
} else if (sCurrentLine.startsWith("Category")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [2] in array ArrayList
} else if (sCurrentLine.startsWith("Essay")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [3] in array ArrayList
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
我拆分的所有字符串[1]索引都需要按以下顺序放入多维数组:问题,答案,类别和论文。
所以我目前正在使用普通的多维数组,但是您不能轻松更改其值。 我希望我的多维数组列表看起来像这样:
多维数组列表
似乎是使用List of List进行的分配。
这是伪代码。 尝试实现休息。
ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
您要做的第一件事是获取4个新鲜的ArrayLists
ArrayList<String> qtns= new ArrayList<String>>();
ArrayList<String> answrs= new ArrayList<String>>();
--
--
将它们全部添加到主列表
array.add(qtns);
--
--
然后像
else if (sCurrentLine.startsWith("Question")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [0] in array ArrayList
array.get(0).add(sCurrentLine.split(":")[1]);//get first list(which is qtns list) and add to it.
} else if (sCurrentLine.startsWith("Answer")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [1] in array ArrayList
array.get(1).add(sCurrentLine.split(":")[1]);//get second list(which is answers list) and add to it.
}
-- -
---
这样一来,您最终将获得一个包含数据的列表列表。
array
是由四个元素组成的数组(或者在设置后将成为-见下文)。 每个元素都是对另一个ArrayList
的引用 ,即ArrayList<String>
。 要修改内部ArrayList
,首先需要获取对它的引用,这需要使用get
方法进行:
array.get(0)
用于[0]
列表,或array.get(1)
用于[1]
列表,依此类推。 结果将是ArrayList<String>
。 现在您可以对此执行方法; 将一个String
添加到ArrayList<String>
的末尾:
array.get(0).add("String to add");
等等
实际上,现在我来看了,您需要首先设置array
的四个元素。 每个元素将被设置为一个new ArrayList<String>
:
for (int i = 0; i < 4; i++)
array.add(new ArrayList<String>());
在方法顶部执行此操作。
这是一个非常糟糕的设计。 您应该创建一个自定义类,将不同类型的行作为字段(也许称为Question
),然后使用List<Question>
来存储单个问题对象。 这样可以使以后的工作更加清晰, 安全 。
您应该使用另一个数据结构来实现这一点,请使用Map<String,List<String>>
,其中可能的键是Question
, Answers
, Category
, Essay
然后,您可以在代码中删除所有不必要的if-else
您的代码示例:
public static void openFile() {
Map<String,List<String>> map = new HashMap<>();
// here you put the keys, you can do it when you read the file based in your input too dynamically
map.put("Question",new ArrayList<>());
map.put("Answers",new ArrayList<>());
map.put("Category",new ArrayList<>());
map.put("Essay",new ArrayList<>());
int retrival = chooser.showOpenDialog(null);
String[]array = null;
if (retrival == JFileChooser.APPROVE_OPTION) {
try (BufferedReader br = new BufferedReader(new FileReader(
chooser.getSelectedFile()))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
if (sCurrentLine.equals("")) {
continue;
}
array = sCurrentLine.split(":");
if(map.containsKey(array[0])){
map.get(array[0]).add(array[1]);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
您可以看到这种方式更加清晰易读。
您可以使用键为(Questions,Answers ..)和ArrayList为值的HashMap
HashMap <String,ArrayList<String>> array = new HashMap<String,ArrayList<String>>();
if(array.containsKey("Question")){
array.get("Question").add(sCurrentLine.split(":")[1]);
}else{
ArrayList<String> questions = new ArrayList<String>();
questions.add(sCurrentLine.split(":")[1]);
array.put("Question",questions );
}
在您的代码中进行修改
public static void OpenFile() {
HashMap <String,ArrayList<String>> array = new HashMap<String,ArrayList<String>>();
int retrival = chooser.showOpenDialog(null);
if (retrival == JFileChooser.APPROVE_OPTION) {
try (BufferedReader br = new BufferedReader(new FileReader(
chooser.getSelectedFile()))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
if (sCurrentLine.equals("")) {
continue;
} else if (sCurrentLine.startsWith("Question")) {
System.out.println(sCurrentLine.split(":")[1]);
if(array.containsKey("Question")){
array.get("Question").add(sCurrentLine.split(":")[1]);
}else{
ArrayList<String> questions = new ArrayList<String>();
questions.add(sCurrentLine.split(":")[1]);
array.put("Question",questions );
}
//add to [0] in array ArrayList
} else if (sCurrentLine.startsWith("Answer")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [1] in array ArrayList
//Do the same as above if condition with Answer as Key
} else if (sCurrentLine.startsWith("Category")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [2] in array ArrayList
} else if (sCurrentLine.startsWith("Essay")) {
System.out.println(sCurrentLine.split(":")[1]);
//add to [3] in array ArrayList
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
创建2D阵列后,还需要创建4个1D阵列。
ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
// 1D array for "Question"
array.add(new ArrayList<String>());
// 1D array for "Answer"
array.add(new ArrayList<String>());
// 1D array for "Category"
array.add(new ArrayList<String>());
// 1D array for "Essay"
array.add(new ArrayList<String>());
假设如果您需要向问题数组中添加一项,则应该这样做:
array.get(i).add(...);
其中i =0。i的范围是0到3,对应于4个枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.