我有一个ArrayList
每个索引有多个对象。我想特别按一个对象按字母数字顺序对这个列表进行排序。该对象是“my_id”,该对象的值可能类似于:1A、10B、11B、2C、205Z 等。
我需要对这些进行排序才能出来:1A、2C、10B、11B、205Z。首先对数字部分进行排序,然后对字母部分进行次要排序。 1,2,3,4,5,...A,B,C,D,E,...
我检查了一些非常有效的字母数字字符串排序: http://sanjaal.com/java/206/java-data-structure/alphanumeric-string-sorting-in-java-implementation/
不幸的是,我只能对该对象进行排序,而我丢失了 ArrayList
中的其他对象作为结果。我真的需要一个可以重新排列 ArrayList
的排序算法索引由我选择的对象组成,并且不会丢失其他对象!
有没有一种方法可以做到这一点?我一直找不到一个。我认为添加我的 ArrayList
中的所有对象很有用映射字符串: ArrayList<HashMap<String, String>>
[编辑]
我有我的数组:
ArrayList<HashMap<String, String>> al
然后我存储该对象:
String[] alphaNumericStringArray = new String[al.size()];
for(int i = 0; i < al.size(); i++)
{
alphaNumericStringArray[i] = al.get(i).get("my_id");
}
我现在对字符串数组进行排序:
// Sort the array now.
Arrays.sort(alphaNumericStringArray, new AlphanumericSorting());
然后我把对象放回去:
for(int i = 0; i < al.size(); i++)
{
HashMap<String, String> map = new HashMap<String, String>();
map.put("my_id", alphaNumericStringArray[i]);
// TODO, need to append the rest of the objects.
al.set(i, map);
}
我知道你在想什么,当我重新映射它时,我不会将所有对象添加回来。这就是我目前所拥有的,但我想要的是一种对整个列表进行排序的方法,而不仅仅是一个对象“my_id”。我想重新排列索引,这样我就不必在最后重新映射所有内容。
最佳答案
运行main
方法:
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Sorter {
public static void main(String[] args) {
List<String> unsorted = Arrays.asList("1A", "10B", "B", "753c", "Z", "M7", "32x", "11B", "2C", "205Z");
Collections.sort(unsorted, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.isEmpty())
return -1;
if (o2.isEmpty())
return 1;
String o1number = extractNumberPrefix(o1);
String o2number = extractNumberPrefix(o2);
if (o1number.isEmpty())
if (o2number.isEmpty())
return o1.compareTo(o2);
else return 1;
if (o2number.isEmpty())
return -1;
if (o1number.equals(o2number))
return o1.compareTo(o2);
return Integer.parseInt(o1number) - Integer.parseInt(o2number);
}
private String extractNumberPrefix(String o1) {
String result = "";
for (int i = 0; i < o1.length(); i++) {
try {
Integer.parseInt(o1.substring(i, i + 1));
result += o1.substring(i, i + 1);
} catch (Exception e) {
break;
}
}
return result;
}
});
System.out.println("sorted = " + unsorted);
}
}
返回:
sorted = [1A, 2C, 10B, 11B, 32x, 205Z, 753c, B, M7, Z]
关于java - 使用 HashMap 对 ArrayList 进行字母数字排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746512/