2016-12-14 5 views
0

完全に動作するソートベクターを作成しました。しかし、私のAddメソッドは非常に長く、冗長なコードがたくさんあるような気がします。ソートベクター - AddItem

バイナリ検索関数が書かれています。この関数をAdd関数でも比較する代わりに、Addメソッドで使用したいと思います。

以下は私のコードです:

public class SortedVector 
{ 

    private int maxcap = 10, noOfItems = 0, grow = 10; 
    private String[] data = new String[maxcap]; 

    // Default Constructor 
    public SortedVector() 
    { 
    } 

    public void SetGrowBy(int growby) 
    { 
     grow = growby; 
    } 


    public int GetCapacity() 
    { 
    return maxcap; 
    } 

    public int GetNoOfItems() 
    { 
    return noOfItems; 
    } 

    public String GetItemByIndex(int index) 
    { 

    if (index > noOfItems+1 || index < 0) 
    { 
     return null; 
    } 
    else 
    { 
     String item = data[index]; 
     return item; 
    } 
    } 



    public int FindItem(String search) 
    { 
     int low=0; 
     int high = noOfItems - 1; 

     return binarySearch(search, low, high); 
    } 


    public int binarySearch(String search, int low, int high) 
    { 
     if(low>high) 
      return -1; 
     int mid = (low + high)/2; 
     if (data[mid] == search) 
      return mid; 
     else 
      if (data[mid].compareToIgnoreCase(search)<0) 
       return binarySearch(search, mid+1, high); 
      else 
       return binarySearch(search, low, mid-1); 
    } 



    public void AddItem(String value) 
    { 
     int thirdCounter = 0; 
     int fourthCounter = 0; 
     int place3= 0; 
     int place4 =0; 
     if(maxcap > noOfItems) 
     { 
      if(noOfItems == 0) 
      { 
      data[0] = value; 
      noOfItems++; 
      } 
      else 
      { 
      int firstCounter = noOfItems; 
      for (int i=0; i < firstCounter; i++) 
      { 
       String[]temp = new String[maxcap]; 

       if(thirdCounter == 0) 
       { 
       if (data[i].compareToIgnoreCase(value)>0) 
       { 
        for (int j=0; j < noOfItems; j++) 
        { 
        temp[j+1] = data[j]; 
        } 
        data=temp; 
        data[0] = value; 
        noOfItems++; 
        thirdCounter++; 
       } 
       else 
       { 
        if(data[i].compareToIgnoreCase(value)<0) 
         { 
          for (int j=0; j < noOfItems; j++) 
          { 
           if (data[j].compareToIgnoreCase(value)>0) 
           { 
            if(fourthCounter ==0) 
            { 
             temp[j+1] = data[j]; 
             place3 = j; 
             fourthCounter++; 
            } 
            else 
            { 
             temp[j+1] = data[j];          
            } 
           } 
           else 
           { 
            temp[j]=data[j]; 
            place4 = j; 
           } 
          } 
          if (place3 == 0) 
          { 
           if(place4 == 0) 
           { 
           data=temp; 
           data[1] = value; 
           noOfItems++; 
           firstCounter++; 
           } 
           else 
           { 
           data=temp; 
           data[place4+1] = value; 
           noOfItems++; 
           thirdCounter++; 
           } 
          } 
          else 
          { 
           data=temp; 
           data[place3] = value; 
           noOfItems++; 
           thirdCounter++; 
          } 
         } 
        } 
       } 
      } 
      } 
     } 
     else 
     { 
      int firstCounter = 0; 
      maxcap = grow +maxcap; 
      String[]temp3 = new String[maxcap]; 
      for (int i=0; i < noOfItems; i++) 
      { 
       if(firstCounter == 0) 
       { 
        if (data[i].compareToIgnoreCase(value)>0) 
        { 
        for (int j=0; j < noOfItems; j++) 
        { 
         temp3[j+1] = data[j]; 
        } 
        data=temp3; 
        data[0] = value; 
        noOfItems++; 
        firstCounter++; 
        } 
        else 
        { 
         int place1 = 0; 
         int place2 = 0; 
         int secondCounter = 0; 
         if(data[i].compareToIgnoreCase(value)<0) 
         { 
          for (int j=0; j < noOfItems; j++) 
          { 
           if (data[j].compareToIgnoreCase(value)>0) 
           { 
            if(j/2!=0 && secondCounter ==0) 
            { 
             temp3[j+1] = data[j]; 
             place1 = j; 
             secondCounter++; 
            } 
            else 
            { 
             temp3[j+1] = data[j];           
            } 
           } 
           else 
           { 
            temp3[j]=data[j]; 
            place2 = j; 
           } 

          } 
          if (place1 == 0) 
          { 
           if(place2 == 0) 
           { 
            data=temp3; 
            data[1] = value; 
            noOfItems++; 
            firstCounter++; 
           } 
           else 
           { 
            data=temp3; 
            data[place2+1] = value; 
            noOfItems++; 
            firstCounter++; 
           } 
          } 
          else 
          { 
           data=temp3; 
           data[place1] = value; 
           noOfItems++; 
           firstCounter++; 
          } 

         } 
        } 
       } 
      } 

     } 
     System.out.println("adding: "+value); 
    } 

    public void DeleteItem(int index) 
    { 
     if (index < noOfItems && index >= 0) 
     { 
      data[index] = null; 
      if (data[index+1] != null) 
      { 
       int j = index; 
       for(int i = (index+1); i<noOfItems; i++) 
       { 

        data[j] = data[i]; 
        j++; 
       } 
      } 
      noOfItems--; 
     } 
     System.out.println("deleted: "+index); 
    } 


    public String toString() 
    { 
    return super.toString(); 
    } 
} 

私は感謝することを行うことができます方法上の任意のヒント。

親切、 ベン。

+1

私はあなたがその機能をどのように複雑にしているか分かりません。 – John3136

+1

どちらもありません!私はそれをコーディングして取り除きました、そして、それは出てきた怪物でした。私はそれを行う簡単な方法がなければならないことを知っています!それは動作しますが、それはとても面倒です。 – benjano

答えて

0

ここでは、

DEMOです:最も簡単な方法は、要素が見つからない場合binarySearchが挿入位置を返すようですhttps://repl.it/Eqak/0

public void AddItem(String value) 
    { 
     // Check if cursor at last 
     if(noOfItems + 1 == maxcap){ 
     // Resize data 
     maxcap *= 2; 
     String[] newData = new String[maxcap]; 
     System.arraycopy(data, 0, newData, 0, noOfItems); 
     data = newData; 
     } 

     // find the last element according to value 
     int idx = 0; 
     for(; idx<noOfItems; idx++){ 
     if(data[idx].compareToIgnoreCase(value) >= 0) { 
      break; 
     } 
     } 

     // move elements if required 
     if(idx < noOfItems){ 
     System.arraycopy(data, idx, data, idx+1, noOfItems-idx); 
     } 

     // set element on index 
     data[idx] = value; 

     noOfItems++; 

     System.out.println("adding: "+value); 
    } 
1

addを実装すると、(binaryAdd)はバイナリ検索の実装方法とほとんど同じです。コードは99%似ています。

みましょうあなたは、以下のデータを持っていると言う:

+--------------------------+ 
|10|20|30|40|50|60|70|80|90| 
+--------------------------+ 

あなたはそれに35を追加し、昇順にデータを保存しておきたいです。

中間値は50であり、35は< 50であり、我々は、10〜50に興味を持っている:

+--------------+ 
|10|20|30|40|50| 
+--------------+ 

中間値は30であり、35は> 30であるので、我々は30に興味を持っています50:

+--------+ 
|30|40|50| 
+--------+ 

半ば値は40で、35は< 40であることから、我々は30から40に興味を持っている:

+-----+ 
|30|40| 
+-----+ 

あなたは2つの要素を残し、左または比較のために右のいずれかを選択します。プロセスは、バイナリ検索に似ていますが、代わりに目標値の位置を返すので、あなたが挿入する位置を返す

if you choose left, 35 > 30, so 35 should be added after 30. 
if you choose right, 35 < 40, so 35 should be before after 40. 

を値。

0

。非常に多くのArrays.binarySearchのように行います。

を返す:検索キーのインデックスを、それが配列に含まれている場合。それ以外の場合は、( - (挿入ポイント) - 1)ret=binarySearchのリターンが負の場合

ので、あなただけの挿入位置を取得するために-ret-1を取る必要があります。

the code、そのオープンソース(とにかく

(いいえ、私はそのコードをコピー/ペーストしません;リンクのみの回答 - それを取るか放置してください)。

関連する問題