【问题标题】:Sorting array of strings by value within the string按字符串中的值对字符串数组进行排序
【发布时间】:2014-10-28 17:29:12
【问题描述】:

我已经被这件事难住了一段时间。我有一个字符串数组,所有这些字符串都包含一些数值,我需要提取这些数值并用于比较以便对数组进行排序。我尝试过使用带有比较器的内置方法排序,但没有成功。

如果有人能给我一点见解或指出正确的方向,将不胜感激。

该数组包含格式为:“NAME 已工作 x 小时”的字符串

我的意图是提取数字并根据整数的值进行排序,同时仍保持与名称的关系。

public static <T> void sort(T[] a, Comparator<? super T> c)

【问题讨论】:

  • 你能发布字符串数组吗?以及你想要的结果
  • 关于在所有语言中实现“自然排序”有很多答案...
  • @Rod_Algonquin - 他有一个字符串数组,例如{"10","2","1"}。字符串自然排序的问题(默认Arrays.sort(stringArray)是他会得到{"1","10","2"}的答案。他需要{"1","2","10"}(整数排序)。
  • @TheLostMind - 我同意,我认为这是问题所在。但是,我认为答案是将字符串解析为自定义对象,然后对它们进行排序。我想不出直接处理字符串有什么好处,特别是如果你的对象有一个等效的 toString 方法。

标签: java arrays string sorting int


【解决方案1】:

您可以使用Collections.sort 使用comparator 对您的字符串进行排序,并将String 解析为Integer 以使您能够按整数对其进行排序。

样本:

    String s[] = { "10", "2", "1" };
    Collections.sort(Arrays.asList(s), new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            int i = Integer.parseInt(o1);
            int i2 = Integer.parseInt(o2);
            if (i > i2)
                return 1;
            else if (i < i2)
                return -1;
            else
                return 0;
        }
    });
    System.out.println(Arrays.toString(s));

结果:

[1, 2, 10]

【讨论】:

  • 数组包含以下格式的字符串:“NAME 已经工作了 x 小时” - 所以,他需要稍微改变他的 compare() 逻辑(基于编辑的问题) .但或多或少,这是正确的答案。 +1。
【解决方案2】:

确保您处理所有边缘情况,但以下代码应该适合您。

public class NumericStringComparator implements Comparator<String> {
    @Override
    public int compare(String str1, String str2) {
        Integer num1 = extractNumericValue(str1);
        Integer num2 = extractNumericValue(str2);

        // handle null/error cases

        return num1.compareTo(num2);
    }

    private static Integer extractNumericValue(String str) {
        // extract numeric value however but as an example
        return Integer.parseInt(str);
    }
}

使用此比较器,您可以使用Arrays.sort(..) 方法对列表进行排序

String[] array = ...;
Arrays.sort(array, new NumericStringComparator());

【讨论】:

  • 最佳答案恕我直言。顺便说一句,如果extractNumericValue() 返回一个Integer,整个比较部分将缩小到extractValue(str1).compareTo(extractValue(str2))
【解决方案3】:

如果每个字符串只包含数字,那么您可以使用 ParseInt 获取每个字符串的整数值,然后使用常规比较器对它们进行排序。如果字符串包含非数字字符和整数,那么这会使事情变得复杂,您可能需要创建一个辅助方法来为您完成繁琐的工作。一个可能(尽管效率低下)的实现可能看起来像......

public static int getNumbersFromString(String string)
{
    String numbers = "";
    for(int i = 0; i < string.length; i++)
    {
        if((int)(string.charAt(i) >= 48 && (int)(string.charAt(i) <= 57)
            numbers += string.charAt(i);
    }
    int foo = Integer.parseInt(numbers);
    return foo;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 2012-10-14
    • 2014-01-05
    • 2022-11-25
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多