我终于把代码送到了它的工作原理。虽然它不是最容易阅读的。 我正在阅读
的文本文件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
我通过转动我的地图<字符串,整数>进入一个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());
}
}
}
答案 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());
}
});
请注意,b
与a
进行比较,而不是相反,为我们提供逆序(从大到小)。
全部分两行完成。如果您然后迭代列表,它将按您想要的顺序。使用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));
}
希望这是你需要的答案。