java - 使用 HashMap 对 ArrayList 进行字母数字排序

标签 java android sorting arraylist

我有一个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/

相关文章:

javascript排序二维数组在我的数组中重复

java - Hibernate @Audited 与 @Version 冲突

java - Selenium 等待 Element 的任何一个可见

android - Android list 合并不能合并三个 list 文件

android - LinearLayout : TextViews at left, 右边的大ImageView

C++多线程 - 与线程合并排序的算法替代

c++ - 检测循环依赖的依赖排序

java - ImageIO 无法读取输入文件

模拟 ObjectMapper 时出现 java.lang.VerifyError

java - 如何知道输入的 edittext 文本是否是链接?