我有以下代码对项目的混合数组进行排序,同时保持类型的位置:
例如:
[20, "abc", "moose", 2,1] turns into [1, "abc", "moose", 2, 20]
算法:
public class Algorithm {
public static String[] sortMixedArray(String[] input){
if (input.length == 0){
return input;
}
// make new arraylist for strings and numbers respectively
List<String> strs = new ArrayList<String>();
List<Integer> numbers = new ArrayList<Integer>();
// add values to the arraylist they belong to
for (String item : input){
if (NumberUtils.isNumber(item)){
numbers.add(Integer.valueOf(item));
} else {
strs.add(item);
}
}
// sort for O(nlogn)
Collections.sort(strs);
Collections.sort(numbers);
// reuse original array
for (int i = 0; i < input.length; i++){
if (NumberUtils.isNumber(input[i])) {
input[i] = String.valueOf(numbers.remove(0));
} else {
input[i] = strs.remove(0);
}
}
return input;
}
public static void main(String[] args) {
String[] test = new String[] {"moo", "boo"};
System.out.println(Arrays.toString(sortMixedArray(test)));
}
我有一个由两部分组成的问题:
1。在数组和arraylist之间切换是否有效?也就是说,如果我输入必须是一个数组,我应该在任何地方使用数组而不是arraylist。
2. 将arraylist项目放回数组的最佳方法是什么?我正在检查类型,有更好的方法吗?
答案 0 :(得分:1)
不,但除非你有数百万元素,否则它不太重要。
为开发人员做任何你认为最简单,最有效的事情。
BTW效率最低的操作是remove(0)
O(N)
,因此您可能会更改此操作。
答案 1 :(得分:1)
1.如果你按照代码的方式进行,那么它就完全没问题了。如果你事先知道你将拥有多少元素,那么最好使用数组,但在你的例子中并非如此。
2.最好和最简单的方法是使用toArray()
界面的List
功能。
ArrayList<String> list = ...;
String[] array = list.toArray(new String[list.size()]);
但是这对你的代码不起作用,因为你将两个列表合并到一个数组中。您仍然可以稍微改进一下代码,因为在将它们放回到数组中时,实际上不必从列表中删除这些项目。这保护了一些计算,因为从ArrayList
中删除第一个元素是非常低效的(每次删除操作的O(N)运行时)。
for (int i = 0, s = 0, n = 0; i < input.length; i++) {
if (NumberUtils.isNumber(input[i])) {
input[i] = Integer.toString(numbers.get(n++));
} else {
input[i] = strs.get(s++);
}
}