我有一个包含3列整数的文本文件,第一列上的每个数字都有多个条目,如上例所示:
1 23 1
1 24 2
1 57 1
1 10 1
1 59 2
1 31 2
1 38 1
1 11 1
2 39 2
2 40 1
2 15 1
2 74 2
我可以使用上面显示的代码读取文件的内容
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("/home/user/Desktop/file.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
}
catch (IOException e) {
e.printStackTrace();
} }
但是我想使用hashmap连接一行中第一列的每个不同数字的所有条目,如下所示:
1 23 1 24 2 57 1 10 1 59 2 31 2 38 1
2 39 2 40 1 15 1 74 2
你有什么建议吗? 谢谢!
答案 0 :(得分:1)
HashMap是一个将Key映射到特定值的Object。这是tobias_k建议的实现:
HashMap<int, String> map = new HashMap<int,String>();
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("/home/user/Desktop/file.txt")))
{
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
// ** NEW CODE **
// get first int in current line
int first = Integer.parseInt(sCurrentLine.substring(0, sCurrentLine.indexOf(" ")))
// get rest of line
String rest = sCurrentLine.substring(sCurrentLine.indexOf(" ")).trim();
// get what is currently in for key value and append to it what you just got
map.put(first, map.get(first) + rest);
System.out.println(sCurrentLine);
}
}
catch (IOException e) {
e.printStackTrace();
} }
要打印,你可以这样做:
for(int key : map.keySet()) {
System.out.println(map.get(key));
}
免责声明可能不是100%有效的语法
答案 1 :(得分:1)
以下是一些帮助您入门的基本代码。这使用TreeMap对条目进行排序。阅读HashMap上的blurb以了解原因,它指定HashMap保证不对条目进行排序。可以使用HashMap,但我不推荐它,因为你可能需要在某处做额外的步骤。
TreeMap<Integer, ArrayList<Integer[]>> rowMap = new TreeMap<Integer, ArrayList<Integer[]>>();
// when you have your new line
String[] cols = sCurrentLine.split(" ");
if (cols.length < 1) {
// handle error if there is not a key column
}
try {
int colKey = Integer.parseInt(cols[0]);
Integer[] colValues = new Integer[cols.length - 1];
for (int i = 1; i < cols.length; i++) {
colValues[i - 1] = Integer.parseInt(cols[i]);
}
if (!rowMap.containsKey(colKey)) {
// add a new entry for this column number
rowMap.put(colKey, new ArrayList<Integer[]>());
}
rowMap.get(colKey).add(colValues);
} catch (NumberFormatException e) {
// handle error if any columns don't have integers
}
现在你所拥有的是一个TreeMap,其中包含按第1列中的数字分组的所有行的列表。
要打印整个地图的示例文档,您可以执行以下操作:
// iterate by column 1 number in numerical order
for (Integer key : rowMap.keySet()) {
// iterate by rows in this column in the order they were added
for (Integer[] row : rowMap.get(key)) {
String printout = key + ":";
// iterate by columns in this row
for (Integer col : row) {
printout += " " + col;
}
System.out.println(printout);
}
}
这将输出以下内容:
1: 23 1
1: 24 2
1: 57 1
1: 10 1
1: 59 2
1: 31 2
1: 38 1
1: 11 1
2: 39 2
2: 40 1
2: 15 1
2: 74 2
所以你可以看到这根据第1列中的值对文档进行排序。你也可以用你在OP中显示的格式打印它们,你只需稍微更改一下循环就可以将行添加到同一行。
关于以这种方式使用TreeMap的一些注意事项:
但是当您使用Map列出它们时,它们将始终按列1编号分组,并且它们将始终以数字顺序排序。
如果您不关心保持行的排序,可能会有所简化,在这种情况下,如果你所有的话,你可以制作TreeMap<Integer, ArrayList<Integer>>
或TreeMap<Integer, ArrayList<String>>
甚至是TreeMap<Integer, String>
do是连接每一行。
答案 2 :(得分:0)
以下是更适合我的代码,并显示第一列中每个不同数字汇总的所有数字。谢谢大家发布解决方案。如果您对此有任何改变,请随时这样做。
public static void main(String[] args) {
String sCurrentLine;
TreeMap<Integer, ArrayList<Integer[]>> rowMap = new TreeMap<Integer, ArrayList<Integer[]>>();
try (BufferedReader br = new BufferedReader(new FileReader("/home/user/Desktop/file.txt")))
{
while ((sCurrentLine = br.readLine()) != null) {
String[] cols = sCurrentLine.split(" ");
if (cols.length < 1) {
}
try {
int colKey = Integer.parseInt(cols[0]);
Integer[] colValues = new Integer[cols.length - 1];
for (int i = 1; i < cols.length; i++) {
colValues[i - 1] = Integer.parseInt(cols[i]);
}
if (!rowMap.containsKey(colKey)) {
rowMap.put(colKey, new ArrayList<Integer[]>());
}
rowMap.get(colKey).add(colValues);
} catch (NumberFormatException e) {
}
for (Integer key : rowMap.keySet()) {
String row = key + "";
for (Integer[] rows : rowMap.get(key)) {
for (Integer col : rows) {
row += " " + col;
}
}
System.out.println(row);
}
}
catch (IOException e) {
e.printStackTrace();
}
}