2014-02-10 50 views
0

實施例:在HashMap.(map.put(0,"zero")排序基於英文名稱一個整數陣列

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

我所做的是把整數,字符串值..)

使用上述的HashMap

創建新的字符串數組
String Array{ one,twotwo,fourfour,threefourfivesix,ninenineninenine} 

記得輸入的索引字符串數組

排序字符串數組,然後用HashMap替換整數字符串值。

有沒有其他更好的方法來做到這一點?

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+" "); 
    } 

    } 


} 
+0

什麼編碼到nw? – Kick

+0

您可能需要更清楚地說明map.put(0,「zero」)等中「etc」的含義,因爲我假定您沒有硬編碼10000個值。 – Dukeling

+0

順便說一句,你的地圖應該用另一種方式構建:'map.put(「zero」,0)'。 –

回答

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; 
    } 
} 
+0

這個解決方案看起來比我粗略的編碼更好。 – eagle06

0

執行此操作的最佳方法是創建一個具有數字和字符串表示形式的單個對象。

即當你創建一個new NumberAndName(3)它將設置一個內部整數爲3和內部字符串爲「三」。如何處理該映射取決於您,但如果您只需要數字0到9,則可以使用簡單的String數組。

然後,您可以在NumberAndName對象集合上使用Collections.sort(),指定一個使用名稱比較它們的比較器。

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); 
      } 
     } 
    }; 
}