根据英文名称对Integer数组进行排序

时间:2014-02-10 09:12:15

标签: java arrays algorithm sorting hashmap

示例:

Input: { 1,22,44,3456,9999}
Output {44,9999,3456,22}

我所做的是在HashMap.(map.put(0,"zero")等中放置整数,字符串值。)

使用上面的HashMap创建一个新的String数组

String Array{ one,twotwo,fourfour,threefourfivesix,ninenineninenine}

记住String Array

的输入索引

对String Array进行排序,然后使用HashMap将String值替换为Integers。

还有其他更好的方法吗?

package l337;

import java.util.Arrays;
import java.util.HashMap;

public class temp{

public static void main(String[] arg){

    HashMap<Integer,String> map = new HashMap<Integer,String>();
    map.put(0,"zero");
    map.put(1,"one");
    map.put(2,"two");
    map.put(3,"three");
    map.put(4,"four");
    map.put(5,"five");
    map.put(6,"six");
    map.put(7,"seven");
    map.put(8,"eight");
    map.put(9,"nine");

    int[] input ={1,2,44,66,7895,88983};
    String[] stringArray = new String[input.length];

    for(int i=0;i<input.length;i++){

        stringArray[i] = map.get(input[i]);
        if(stringArray[i]==null){
            char[] temp= (new Integer(input[i])).toString().toCharArray();
            for(int j=0;j<temp.length;j++){
                stringArray[i]+=map.get((int)temp[j]-48);
            }
        }
    }
    HashMap<String,Integer> maploc = new HashMap<String,Integer>();
    map.put(0,"zero");
    for(int i=0;i<input.length;i++){
        maploc.put(stringArray[i], input[i]);
    }

    Arrays.sort(stringArray);

    int[] output =new int[input.length];
    for(int i=0;i<input.length;i++){
        output[i]= maploc.get(stringArray[i]);
    }
     for(int i:input){

        System.out.print(i+" ");
    }
     System.out.println();
    for(int i:output){

        System.out.print(i+" ");
    }

    }


}

3 个答案:

答案 0 :(得分:0)

执行此操作的最佳方法是创建一个具有数字和字符串表示形式的对象。

即。当您创建new NumberAndName(3)时,它会将内部整数设置为3,将内部字符串设置为“3”。如何处理该映射取决于您,但如果您只需要数字0到9,则String的简单数组将起作用。

然后,您可以在NumberAndName对象的集合上使用Collections.sort(),指定使用该名称进行比较的比较器。

答案 1 :(得分:0)

当您已经有一个存储映射的HashMap时,您可以使用Comparator通过查找并比较地图中的相应值来比较数组的条目

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;

public class SortByName
{
    public static void main(String[] args)
    {
        Integer input[] = { 1,22,44,3456,9999};
        final String array[] = { 
            "one", "twotwo", "fourfour", "threefourfivesix", 
            "ninenineninenine"};

        final Map<Integer, String> map = createMap(input, array);
        Arrays.sort(input, new Comparator<Integer>()
        {
            @Override
            public int compare(Integer i0, Integer i1)
            {
                return map.get(i0).compareTo(map.get(i1));
            }

        });
        System.out.println(Arrays.toString(input));
    }

    private static <K, V> Map<K, V> createMap(K k[], V v[])
    {
        Map<K, V> map = new LinkedHashMap<K, V>();
        for (int i=0; i<k.length; i++)
        {
            map.put(k[i], v[i]);
        }
        return map;
    }
}

答案 2 :(得分:0)

您可以使用枚举来表示数字并具有查找(和反向查找),辅助函数可以转换为数字字符串。 这是一个快速的脏实现,可以做到这一点。

public static void arrayEnglistTest()
{
    int[] array = { 1, 22, 44, 3456, 9999 };

    String[] stringArray = new String[array.length];
    int idx = 0;
    for (int num : array)
    {
        stringArray[idx++] = getNumberInEnglish(num);
    }

    Arrays.sort(stringArray);

    idx = 0;
    for (String stringNumber : stringArray)
    {
        array[idx++] = getNumber(stringNumber);
    }
}

public static int getNumber(String numberInEnglish)
{
    StringBuilder result = new StringBuilder();
    StringBuilder builder = new StringBuilder();
    for (char c : numberInEnglish.toCharArray())
    {
        builder.append(c);
        String soFar = builder.toString();
        if (DIGIT.getNumber(soFar) != null)
        {
            result.append(DIGIT.getNumber(soFar));
            builder.setLength(0);
        }
    }
    return Integer.parseInt(result.toString());
}

public static String getNumberInEnglish(int number)
{
    StringBuilder builder = new StringBuilder();
    while (number > 0)
    {
        builder.insert(0, DIGIT.getNumberInEnglish(number % 10));
        number /= 10;
    }
    return builder.toString();
}

enum DIGIT
{
    ONE(1, "one"), TWO(2, "two"), THREE(3, "three"), FOUR(4, "four"), FIVE(5, "five"), SIX(6, "six"), SEVEN(7,
            "seven"), EIGHT(8, "eight"), NINE(9, "nine"), ZERO(0, "zero");

    private DIGIT(int digit, String digitInEnglish)
    {
        this.digit = digit;
        this.digitInEnglish = digitInEnglish;
    }

    public static String getNumberInEnglish(int number)
    {
        return map.get(number);
    }

    public static Integer getNumber(String numberInEnglish)
    {
        return reverseMap.get(numberInEnglish);
    }

    int digit;
    String digitInEnglish;

    static Map<Integer,String> map = new HashMap<Integer,String>() {
        {
            for (DIGIT dig : EnumSet.allOf(DIGIT.class))
            {
                put(dig.digit, dig.digitInEnglish);
            }
        }
    };
    static Map<String,Integer> reverseMap = new HashMap<String,Integer>() {
        {
            for (DIGIT dig : EnumSet.allOf(DIGIT.class))
            {
                put(dig.digitInEnglish, dig.digit);
            }
        }
    };
}