Java-Map<;字符串,整数>;已转换为对象[],如何排序
我终于把我的代码带到了它工作的地方。虽然它不是最容易阅读的。 我正在从一个文本文件中读取Java-Map<;字符串,整数>;已转换为对象[],如何排序,java,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 为此,我将我的Map转换为一个对象[]tipsperson 那么,我该如何将这个对象[]tipsperson分类成这样一个更容易阅读的对象(有2000多个名称) Y=
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
为此,我将我的MapY=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());
}
}
}
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.util.HashMap;
导入java.util.Map;
公开课小费{
公共静态void main(字符串[]args)
{
int lineNumber=1;
Map tipsByName=new HashMap();
String fileName=“C:\\Users\\David\\Desktop\\tips.txt”;
System.out.println(“从文件中读取文本”);
试一试{
FileReader inputFile=新的FileReader(文件名);
BufferedReader BufferedReader=新的BufferedReader(inputFile);
弦线;
字符串currentTipper=null;
而((line=bufferedReader.readLine())!=null){
如果(行号%2!=0){
最终字符串tipperName=行.子字符串(行.索引of(“from”)+5);
currentTipper=tipperName;
}否则{
最终整数tipValue=Integer.parseInt(line.substring(0,line.indexOf(“\t”));
//在这里,我们将提示存储在地图中。如果我们有记录,我们求和,否则
//我们按原样储存
tipsByName.put(currentTipper,(tipsByName.get(currentTipper)==null?0:tipsByName.get(currentTipper))
+tipValue);
}
lineNumber++;
}
bufferedReader.close();
对象[]tipsName=tipsByName.entrySet().toArray();
对于(int i=0;i
哎哟。不要那样做!试试这个
// 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.
}
//获取条目。
java.util.Set entrySet=tipsByName
.entrySet();
//使用自定义比较器制作一个分类数据集。
SortedSet SortedSet=新树集(
新比较器(){
公共整数比较(
条目o1,
入口(氧气){
如果(o1==o2){
返回0;
}else if(o1==null){
返回-1;
}否则如果(o2==null){
返回1;
}
返回o1.getValue().compareTo(
o2.getValue());
}
});
//将条目添加到SortedSet。
for(条目:entrySet){
分拣集添加(条目);
}
//迭代sortedSet。
迭代器iter=sortedSet
.iterator();
while(iter.hasNext()){
System.out.println(iter.next());//打印已排序的项目。
}
建议:使用地图,不要进行任何数组转换。
map类为您提供了所需的一切。
您可以像现在一样迭代键、值或两者
只需使用映射的键值并将其作为参数传递给
Collections.sort()。这是因为返回的键集是Collection类型
可以传递给Collections.sort()方法
然后按字母顺序排列。
如果需要其他内容,只需向Collection.sort()传递一个附加的Comparator类
或者将对象包装在实现
接口可比
在那之后,您只需遍历键和
调用map.get(key)方法
例如:
Iterator<String> sortedKeys = map.keySet().iteator();
for (String key :keys) {
sysout(key: "+key+" value : "+ map.get(key));
}
迭代器sortedKeys=map.keySet().Iterator();
用于(字符串键:键){
sysout(键:“+key+”值:“+map.get(键));
}
希望这是您需要的答案。只需将条目转储到列表中,并使用比较器对其进行排序:
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());
}
});
转换为对象数组有什么特别的原因吗?你们可以转换为整数数组并应用排序,这样你们就可以按值降序对地图进行排序了?升序还是降序。这样我就不必来回检查值并按顺序排列,但你们需要一个全高清屏幕来满足你们的行要求定义;-)
List entries=new ArrayList(map.entrySet())如果你用的是1.7,那么第一行就有可能。你绝对是一个了不起的波希米亚人!!!!非常感谢!!!!!我想让它发挥作用,真是疯了!我可以问一下你是从哪里学会Java的吗?我一直在用一本书,但我觉得除了基本语法之外,它并没有教我太多东西谢谢你!
。我从我是一个朋友,已经使用它大约15年了。我没有读过很多关于它的书。我是通过实践来学习的。学习GOF模式,总是寻找使用java JDK的方法,特别是集合。还学习正则表达式-它可以如此强大和有用。总是从专业人士那里学习-阅读博客,在这里和类似论坛阅读更好的答案,观看youtube视频,来自google devs和Josh Bloch。最后,试着在这里回答问题:当你尝试回答时,你可能会惊讶于你不知道什么,当你回答得好时,你会学到多少。我将发布我的其余代码,以便你能看到我在做什么
for (Map.Entry<String, Integer> entry : entries)
System.out.println(entry + '\n');