如何对存储为字符串的大数字数组进行排序?

问题描述 投票:0回答:2

为了对数组进行排序,我们不能使用整数(或

Long
)解析,因为大小非常大。

例如

String[] arr = new String[] {
        "545434548549387551787458475822", 
        "555434548549387551787458475822",
        "7485204875485114857489579847438573954738574359287485284574"
    };

我们只有字符串的组成部分。

java algorithm sorting data-structures
2个回答
1
投票

您可以使用 Java 的 BigInteger 类以及自定义比较器来对数组进行排序:

import java.util.Arrays;
import java.math.BigInteger;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        String[] arr = {
            "545434548549387551787458475822",
            "7485204875485114857489579847438573954738574359287485284574",
            "555434548549387551787458475822"
        };
        System.out.println("Before sorting:\n" + Arrays.toString(arr));
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return new BigInteger(o1).compareTo(new BigInteger(o2));
            }
        });
        // Alternative lambda custom comparator: 
        // Arrays.sort(arr, (o1, o2) -> new BigInteger(o1).compareTo(new BigInteger(o2)));
        System.out.println("After sorting:\n" + Arrays.toString(arr));
    }
}

输出:

Before sorting:
[545434548549387551787458475822, 7485204875485114857489579847438573954738574359287485284574, 555434548549387551787458475822]
After sorting:
[545434548549387551787458475822, 555434548549387551787458475822, 7485204875485114857489579847438573954738574359287485284574]

1
投票

如果您无法将其转换为标准

Number
实例(在 Java 中),则使用词法排序而不是数字排序。

对于数字串的整数部分:

  1. 确保所有字符串仅包含数字。删除空格等。
  2. 确保所有字符串的长度相同。如果长度不同,请在前面添加正确数量的零。例如,如果最大字符串的长度为 10,并且您有一个字符串为
    99
    ,则将其设为
    0000000099
  3. 在此阶段,字符串已准备好进行比较。简而言之,像对任何字符串数组一样对数组进行排序。

对于数字串的小数部分:

如果您的数组包含小数,在排序之前,您必须将上述算法扩展为:

  1. 将小数点定位在所有字符串中的特定位置,例如 11。您必须通过分析所有字符串来选择位置。
  2. 所有字符串中小数点后的位数也应该相同。同样,最后,字符串的长度应该相同。但对于小数部分,请通过在末尾填充零来实现。 (我们只需要这个填充作为安全网来比较数字上等效的数字字符串,例如
    "1.260"
    "1.26"
    。如果我们确定所有数字彼此不同,那么我们就不需要这个。)
© www.soinside.com 2019 - 2024. All rights reserved.