Java - Map <string,integer =“”>转换为Object [],如何排序</string,>

时间:2013-12-14 05:18:12

标签: java

我终于把代码送到了它的工作原理。虽然它不是最容易阅读的。 我正在阅读

的文本文件
Date/time Tip from xxx
tip    totalAmount

我的代码现在接受一个人倾斜的金额并将它们加在一起。例如X尖端10,X尖端20,X尖端30,Y尖端200,Z尖端30,Z尖端40和输出

X=60
Y=200
Z=70

我通过转动我的地图&lt;字符串,整数&GT;进入一个Object [] tipsPerPerson

那么我该如何将这个Object [] tipsPerPerson排序成更容易阅读的东西(超过2000个名字)有点像这样

Y=200
Z=70
X=60

这是我坚持的代码的一部分

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;

public class Tip {

public static void main(String[] args)
{
    int lineNumber = 1;
    Map<String, Integer> tipsByName = new HashMap<String, Integer>();
    String fileName = "C:\\Users\\David\\Desktop\\tips.txt";

    System.out.println("Reading text from file");

    try {
        FileReader inputFile = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(inputFile);
        String line;
        String currentTipper = null;

        while ((line = bufferedReader.readLine()) != null) {
            if (lineNumber % 2 != 0) {
                final String tipperName = line.substring(line.indexOf("from ") + 5);
                currentTipper = tipperName;
            } else {
                final Integer tipValue = Integer.parseInt(line.substring(0, line.indexOf("\t")));
                // here we store the tip in the map. If we have a record we sum, else 
                // we store as is
                tipsByName.put(currentTipper, (tipsByName.get(currentTipper) == null ? 0 : tipsByName.get(currentTipper))
                        + tipValue);
            }

            lineNumber++;
        }
        bufferedReader.close();
       Object[] tipsName = tipsByName.entrySet().toArray();
        for (int i = 0; i < tipsByName.size(); i++) {
            System.out.println(tipsName[i]); // output the map
        }

    } catch (Exception e) {
        System.out.println("Error while reading file line by line: " + e.getMessage());
    }
   }
}

3 个答案:

答案 0 :(得分:1)

只需将条目转储到列表中,然后使用比较器对其进行排序:

List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
    public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
        return Integer.compare(b.getValue(), a.getValue());
    }
});

请注意,ba进行比较,而不是相反,为我们提供逆序(从大到小)。

全部分两行完成。如果您然后迭代列表,它将按您想要的顺序。使用getKey()getValue()进行打印,或者只使用条目的默认toString()

for (Map.Entry<String, Integer> entry : entries)
    System.out.println(entry + '\n');

答案 1 :(得分:0)

哎哟。不要那样做!试试这个......

// Get the Entries.
java.util.Set<Entry<String, Integer>> entrySet = tipsByName
    .entrySet();
// Make a SortedSet with a Custom Comparator.
SortedSet<Entry<String, Integer>> sortedSet = new TreeSet<Entry<String, Integer>>(
    new Comparator<Entry<String, Integer>>() {
      public int compare(
          Entry<String, Integer> o1,
          Entry<String, Integer> o2) {
        if (o1 == o2) {
          return 0;
        } else if (o1 == null) {
          return -1;
        } else if (o2 == null) {
          return 1;
        }
        return o1.getValue().compareTo(
            o2.getValue());
      }
    });
// Add the Entries to the SortedSet.
for (Entry<String, Integer> entry : entrySet) {
  sortedSet.add(entry);
}

// Iterate the sortedSet.
Iterator<Entry<String, Integer>> iter = sortedSet
    .iterator();

while (iter.hasNext()) {
  System.out.println(iter.next()); // print your sorted items.
}

答案 2 :(得分:0)

建议:使用map和d'ont进行任何数组转换。 地图类为您提供所需的一切。 您可以像现在一样遍历键或值或两者。

只需使用地图的键值并将其作为参数传递给 Collections.sort()。这是因为返回的密钥集是Collection类型 可以传递给Collections.sort()方法。

它将按字母顺序排序。 如果你想要别的东西,只需将一个额外的Comparator类传递给Collection.sort() 或者将你的对象包装在一个实现的对象中 interface Comparable。

之后你只需要通过密钥和密钥进行迭代 调用map.get(key)方法。

示例:

Iterator<String> sortedKeys = map.keySet().iteator();
for (String key :keys) {

  sysout(key: "+key+" value : "+ map.get(key));
}

希望这是你需要的答案。