相同的代码为Java 7&产生不同的输出。 8

时间:2015-05-27 10:07:16

标签: java sorting hashmap comparator

在输入为 91912323 时,它为Java 8提供 33221199 输出,而在Java 7中输出为 11223399

此问题陈述也供您参考。

任何帮助都将不胜感激。

  

由1-9的数字组成的字符串将作为输入传递。该   程序必须打印根据数量排序的数字   发生。如果一个或多个数字出现相同的次数,则   必须先打印最小的数字。

     

输入格式:第一行将包含1-9

中的N位数字      

边界条件:3 <= N <= 30

     

输出格式:根据出现次数排序的数字。

     

示例输入/输出1:

     

输入:4443338993

     

输出:3333444998

     

说明:3次出现次数最多(四次)。因此它   首先打印。 4次出现并因此在3s后打印。 9   发生两次,因此在4s后打印。 8只发生一次   因此在9之后印刷。

     

示例输入/输出2:

     

输入:95559998228

     

输出:99995552288

     

说明:这里2和8出现两次。因此2越小   数字在8之前打印。

package E001;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 *
 * @author Anagh
 */

public class CharOccurrences {

    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        char[] arr = input.toCharArray();
        HashMap<String, Integer> map = new HashMap<>();
        for(int i = 0; i < arr.length; i++)
        {
            if(!map.containsKey(String.valueOf(arr[i])))
            {
                map.put(String.valueOf(arr[i]), 1);
            }
            else
            {
                map.put(String.valueOf(arr[i]), map.get(String.valueOf(arr[i]))+1);
            }
        }
        TreeMap<String, Integer> output = sortByValue(map);
        printMap(output);

    }
    public static TreeMap<String, Integer> sortByValue (HashMap<String, Integer> map) 
    {
    ValueComparator vc =  new ValueComparator(map);
    TreeMap<String,Integer> sortedMap = new TreeMap<>(vc);
    sortedMap.putAll(map);
    return sortedMap;
    }

    private static void printMap(TreeMap<String, Integer> map) {
        String key;
        int value;
        for (Map.Entry<String, Integer> entry : map.entrySet()) 
        {
            key = entry.getKey();
            value = entry.getValue();
            for(int j = 0; j < value; j++)
            {
                System.out.print(key);
            }
    }        
    }

}
class ValueComparator implements Comparator<String> {

    Map<String, Integer> map;

    public ValueComparator(Map<String, Integer> base) {
        this.map = base;
    } 
    @Override
    public int compare(String a, String b) {
        if (map.get(a) > map.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys 
    }
}

2 个答案:

答案 0 :(得分:3)

你的比较器正在破坏它的合同,你应该添加一个案例,当出现确切的数量时应该如何对它进行排序,例如较小的数字。

答案 1 :(得分:3)

  

输出:99995552288

     

说明:这里2和8出现两次。 因此2是在8 之前打印的较小数字。

您的比较器未实现该逻辑。为了实现该逻辑,它应该是:

public int compare(String a, String b) {
    if (map.get(a) > map.get(b)) {
        return -1;
    } else if (map.get(a) < map.get(b)) {
        return 1;
    } else {
        return a.compareTo(b);
    }
}