将输入String []与arrayList中的值重用

时间:2016-03-02 23:04:31

标签: java arrays algorithm arraylist

我有以下代码对项目的混合数组进行排序,同时保持类型的位置:

例如:

[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项目放回数组的最佳方法是什么?我正在检查类型,有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

  1. 不,但除非你有数百万元素,否则它不太重要。

  2. 为开发人员做任何你认为最简单,最有效的事情。

  3. 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++);
        }
    }