0

我有一个文本文件,其中包含 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

你有什么建议吗?谢谢!

4

3 回答 3

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% 有效的语法

于 2013-11-08T19:38:03.963 回答
1

这里有一些基本代码可以帮助您入门。这使用了对条目进行排序的 TreeMap。阅读HashMap上的简介以了解原因,它指定 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 的一些注意事项:

  • 第 1 列中的数字可以是任何整数
  • 第 1 列中的数字可以按任意顺序排列
  • 这些行可以具有除第一列之外的任意数量的列。

但是,当您使用地图列出它们时,它们将始终按第 1 列数字分组,并且始终按数字排序。

如果您不关心保持行排序以及在这种情况下您可以制作 a 或什至 a 如果您所做的只是连接每一行,它可能会TreeMap<Integer, ArrayList<Integer>>有所TreeMap<Integer, ArrayList<String>>简化TreeMap<Integer, String>

于 2013-11-08T19:56:37.447 回答
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();
    }
}
于 2013-11-09T09:31:42.030 回答