我有一个价格的字符串[]可能如下所示:
String[0] = 1.22
String[1] = 230.08
String[2] = 34.11
我需要强制转换数组并按升序排序。做这个的最好方式是什么?阵列可能非常大,因此性能非常重要。提前谢谢。
答案 0 :(得分:3)
您可以定义专门的字符串比较器:
class MyComparator implements Comparator<String> {
public int compare(Object a, Object b) {
return Float.valueOf(a.toString()).compareTo(Float.valueOf(b.toString());
}
}
然后使用:
对String数组进行排序Arrays.sort(aStringArray, new MyComparator());
(N.B。可能有更有效的方法来比较代表浮点值的两个字符串。)
答案 1 :(得分:2)
排序数组是一个经典问题。这里的问题是当你对数组进行排序和添加时。
你需要对每一个添加物进行排序吗?你会在排序后添加吗......等等。
如果您在逐个排序后添加,我建议使用 ArrayList 而不是数组。这样,您可以通过跟踪 ArrayList 找到插入点,并在更快的时间内将其放入该索引中。
另外,对于排序,你应该看一下:http://en.wikipedia.org/wiki/Sorting_algorithm,Quicksort是最着名的。
答案 2 :(得分:1)
这样的简单解决方案应该适合您:
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
包含Floats。使用下面评论中的新信息,您希望将它们更改回字符串。你可以用另一个循环来做到这一点:
List<String> numsAsStrings = new ArrayList<String>();
for (Float f : newlist) {
numsAsStrings.add(f.toString());
}
如果您想将List
重新转换为类似于您开始使用的数组,可以使用toArray
界面中的Collection
方法:
vars = numsAsStrings.toArray(new String[0]);
我建议尝试这种“默认”搜索,看看它是否足够快以满足您的需求。令人惊讶的是它能够以多快的速度对事物进行分类。只有在尝试内置并获得速度的想法后,我才会寻找另一种算法。否则就是过早优化。
正如您可以从所有新增内容中看到的那样,最初作为一个简单的解决方案变成了许多代码(除了sort()
方法在内部执行的任何操作之外,循环两次)。虽然这个解决方案即使对于初学者也很容易理解,但我不得不建议使用Ted Hopp建议的Comparator
方法,并选择他的答案作为正确答案。对于必须查看代码的下一个人来说,读取的代码将更少(我唯一的建议是将比较器命名为“stringAsFloatComparator”)
比较器是有用的,强大的,优雅的东西。如果您不熟悉,我建议您阅读Java tutorial的比较器部分。
答案 3 :(得分:1)
如果您将在排序后添加到此数组,那么您可能需要考虑不同的数据结构,例如自平衡二叉树(如Red-Black Tree)。
但是,如果这是一次排序,那么使用Arrays.sort
并定义您自己的Comparator
,如Ted Hopp建议的那样。但是,这是comparison sort,因此O(nlg(n))
会有一个下限。 如果这还不够快,您可能需要尝试使用radix sort counting sort作为O(n)
时间的支持稳定排序 - 这不会产生代码更复杂,因此可能容易出错且难以维护。
答案 4 :(得分:1)
这是对数组进行排序的有效方法:
// Creates a list from the prices array and the list is sorted
List<String> list = new ArrayList<String>(list);
Collections.sort(list);
答案 5 :(得分:0)
现在不需要拳击(即无需使用新的运算符创建OBJECT
使用valueOf使用compareTo of Collections.Sort ..)
首先使用以下代码转换String数组:
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)对于Deascending order
Collections.sort(temp, new Comparator<XYZBean>()
{
@Override
public int compare(XYZBean lhs, XYZBean rhs) {
return Integer.valueOf(rhs.getDistance()).compareTo(lhs.getDistance());
}
});
稍后如果你想要你的String数组,那么使用下面的代码:
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]);
}