Java 基于英文名称对整数数组排序
例如:Java 基于英文名称对整数数组排序,java,arrays,algorithm,sorting,hashmap,Java,Arrays,Algorithm,Sorting,Hashmap,例如: Input: { 1,22,44,3456,9999} Output {44,9999,3456,22} 我所做的是将整数、字符串值放入HashMap.map.put0、zero等 使用上面的HashMap创建一个新的字符串数组 String Array{ one,twotwo,fourfour,threefourfivesix,ninenineninenine} 记住字符串数组的输入索引 对字符串数组进行排序,然后使用HashMap将字符串值替换为整数 还有其他更好的方法吗 pac
Input: { 1,22,44,3456,9999}
Output {44,9999,3456,22}
我所做的是将整数、字符串值放入HashMap.map.put0、zero等
使用上面的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+" ");
}
}
}
最好的方法是创建一个具有数字和字符串表示形式的单个对象 i、 e.当您创建一个新的NumberAndName3时,它将内部整数设置为3,内部字符串设置为3。如何处理该映射取决于您,但是如果您只需要数字0到9,那么一个简单的字符串数组就可以了
然后,您可以只使用Collections.sort对NumberAndName对象的集合进行排序,并指定一个使用名称进行比较的比较器。当您已经有一个存储映射的HashMap时,您可以只使用一个比较器,通过查找和比较映射中的各个值来比较数组项
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;
}
}
您可以使用enum表示数字,并具有查找和反向查找、辅助函数以转换为数字字符串或从数字字符串转换为数字字符串。 这是一个快速脏的实现
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);
}
}
};
}
你编码到nw的是什么?你可能需要更明确地解释一下你在map.put0,zero等中所指的etc,因为我假设你没有硬编码10000个值。顺便说一句,你的map应该以另一种方式构建:map.putzero,0。你可以为整数创建一个比较器,然后用你的自定义比较器排序。从那里可能复制,只需根据结果字符串进行排序。此解决方案看起来比我的原始编码要好得多。