2016-03-02 32 views
1

值I有以下代码,同时保持的类型的位置这种种物品的混合阵列:重用输入字符串[]与从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.将数组列表项放回数组的最佳方式是什么?我正在检查类型,有没有更好的方法?

回答

1

1.如果按照代码中的方式进行操作,那么它非常好。如果事先知道有多少元素,那么最好使用数组,但在您的示例中不是这种情况。

2.最好最简单的方法是使用List接口的toArray()功能。

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++); 
     } 
    } 
1
  1. 不,但是除非你有一百万个元素,否则它是不太可能的。

  2. 做你认为最简单和最有效的开发者。

BTW效率最低的操作是remove(0)这是O(N),所以你可能会改变这种状况。