繁体   English   中英

如何按数字顺序对字符串数组进行排序?

[英]how to sort array of strings in numerical order?

我有一个字符串 [] 的价格,可能如下所示:

String[0] = 1.22
String[1] = 230.08
String[2] = 34.11

我需要转换数组并按升序对其进行排序。 做这个的最好方式是什么? 数组可能非常大,因此性能很重要。 先感谢您。

您可以定义一个专门的字符串比较器:

class MyComparator implements Comparator<String> {
    public int compare(Object a, Object b) {
        return Float.valueOf(a.toString()).compareTo(Float.valueOf(b.toString());
    }
}

然后使用以下命令对您的字符串数组进行排序:

Arrays.sort(aStringArray, new MyComparator());

(注意可能有更有效的方法来比较表示浮点值的两个字符串。)

排序 arrays 是一个经典问题。 这里的问题是当您对数组进行排序和添加时。

您需要对每个添加进行排序吗? 你会在排序后添加吗?...等。

如果您要在排序后逐一添加,我建议使用ArrayList而不是数组。 这样,您可以通过跟踪ArrayList找到插入点,并在更快的时间内将其放入该索引中。

另外,对于排序,你应该看这里: http://en.wikipedia.org/wiki/Sorting_algorithm ,快速排序是最著名的。

像这样的简单解决方案应该适合您:

    String[] vars = {"1.22","230.08","34.11"};

    List<Float> newlist = new ArrayList<Float>();
    for (String s : vars) {
        newlist.add(Float.valueOf(s));  // converts your string to float
    }
    Collections.sort(newlist);

Collections.sort()将对您的列表进行适当的排序(返回 void,因此不要尝试将其分配给那里的新变量)。 此时新列表包含newlist 使用下面评论中的新信息,您希望将它们改回字符串。 你可以用另一个循环来做到这一点:

    List<String> numsAsStrings = new ArrayList<String>();
    for (Float f : newlist) {
        numsAsStrings.add(f.toString());
    }

如果您想将List重新转换为您开始使用的数组,您可以使用Collection接口中的toArray方法:

    vars = numsAsStrings.toArray(new String[0]);

我建议尝试这种“默认”搜索,看看它是否足够快满足您的需求。 它对事物进行分类的速度通常令人惊讶。 只有在尝试了内置并获得了关于速度的想法之后,我才会寻求另一种算法。 否则就是过早的优化。

正如您从所有新增内容中看到的那样,最初是一个简单的解决方案变成了很多代码(除了sort()方法在内部执行的任何操作之外,还循环了两次)。 虽然即使对于初学者来说,这个解决方案也很容易遵循,但我不得不推荐使用 Ted Hopp 建议的Comparator方法,并选择他的答案作为正确的答案。 对于必须查看您的代码的下一个人来说,阅读的代码将更少(我唯一的建议是将比较器命名为“stringAsFloatComparator”)

比较器是有用的、强大的、优雅的东西。 如果您不熟悉它们,我建议您阅读Java 教程的比较器部分。

如果您将在排序后添加到此数组,那么您可能需要考虑不同的数据结构,例如自平衡二叉树(如红黑树)。

但是,如果这是一次性排序,则使用Arrays.sort并按照 Ted Hopp 的建议定义您自己的Comparator器。 但是,这是一种比较排序,因此如果O(nlg(n))会有一个下限。 如果这还不够快,您可能想尝试使用计数排序作为O(n)时间的后备稳定排序的基数排序- 这不会使代码更复杂,因此可能容易出错且不易维护。

这是对数组进行排序的有效方法:

// Creates a list from the prices array and the list is sorted
List<String> list = new ArrayList<String>(list);
Collections.sort(list);

现在不需要装箱(即不需要创建OBJECT使用新的运算符使用 valueOf 与 Collections.Sort..的 compareTo 相结合)

首先使用以下代码转换您的字符串数组:

String[] floats={"0.1","0.2","0.3"};
for(int i=0;i<floats.length;i++) 
{
    List<Float> temp = Collections.singletonList(Float.parseFloat(floats[i]));
} 

1)升序

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(lhs.getDistance()).compareTo(rhs.getDistance());
      }
 });

1)对于降序

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(rhs.getDistance()).compareTo(lhs.getDistance());
      }
 });

稍后如果你想要你的 String arrays 然后使用下面的代码:

Float xyz[] = temp.toArray( new Float[temp.size()]);
String floats[]=new String[temp.size()];

for (int i = 0; i < xyz.length; i++) {
     floats[i] = String.valueOf(xyz[i]);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM