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
为此,我将我的Map转换为一个对象[]tipsperson

那么,我该如何将这个对象[]tipsperson分类成这样一个更容易阅读的对象(有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());
    }
   }
}
导入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');