2012-03-19 4 views
0

私の目標は、2つのString配列を取り、各要素の長さで配列内の要素をソートするメソッドを書くことです。マージソートを使用して???このコードを再帰的に書く簡単な方法はありますか?

これは私が持っているコードですが、もっと凝縮したいのですが、このコードが再帰的かどうかわかりません。

import java.util.Arrays; 
import java.util.Comparator; 

public class Test { 

    private static Comparator<String> COMP = new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      if(o1.length() < o2.length()) { 
       return -1; 
      } 
      if(o1.length() > o2.length()) { 
       return 1; 
      } 
      return o1.compareToIgnoreCase(o2); 
     } 
    }; 

    public static String[] mergeUnsorted(String[] arr1, String[] arr2) { 
     arr1 = sort(arr1); 
     arr2 = sort(arr2); 

     return merge(arr1, arr2); 
    } 

    private static String[] sort(String[] arr) { 
     if(arr.length <= 1) 
      return arr; 

     String[] left = Arrays.copyOfRange(arr, 0, arr.length/2); 
     String[] right = Arrays.copyOfRange(arr, arr.length/2, arr.length); 

     left = sort(left); 
     right = sort(right); 

     String[] combined = merge(left, right); 

     return combined; 
    } 

    private static String[] merge(String[] arr1, String[] arr2) { 
     String[] combined = new String[arr1.length + arr2.length]; 

     int a = 0, b = 0, i = 0; 

     while(a < arr1.length || b < arr2.length) { 
      int compare = 0; 
      if(a >= arr1.length) { 
       compare = 1; 
      } else if(b >= arr2.length) { 
       compare = -1; 
      } else { 
       compare = COMP.compare(arr1[a], arr2[b]); 
      } 

      if(compare < 0) { 
       combined[i] = arr1[a]; 
       i++; 
       a++; 
      } else if(compare > 0) { 
       combined[i] = arr2[b]; 
       i++; 
       b++; 
      } else { 
       combined[i] = arr1[a]; 
       i++; 
       a++; 
       combined[i] = arr2[b]; 
       i++; 
       b++; 
      } 
     } 

     return combined; 
    } 

    public static void main(String[] args) { 
     String[] arr1 = new String[] { "abc", "a", "A", "bA", "Ba" }; 
     String[] arr2 = new String[] { "def", "d", "D", "fG", "Fg", "abcde", "B" }; 

     System.out.println(Arrays.toString(mergeUnsorted(arr1, arr2))); 
    } 
} 

答えて

1

sort staticメソッドはそれ自身を呼び出します。はい、再帰的です。

これは何をしているのでしょうか、効率を達成するために、そのような悪いコードではありません。より短くしたいのであれば、なぜComparatorとArrays.sortを使用しないのですか?

は(あなたは配列アクセスの内側ポストインクリメント変数によって醜いマージコードに数行を救うことができる)

+0

あなたはここで、このコードを見て、これはどこにこのコード – user1276602

+0

良いかもしれないかどうかを確認することはできますか? –

+0

あなたは私がそれを変更することができるようにeditiedされてこれに投票することができますしてください – user1276602

関連する問題