天天看點

有序數組,插入重複數字

有序數組差別于無序數組就是在插入方法中進行排序。

public class OperateOrderNoIndexRepeatable {

 private int[] datas = null;

 private int currentIndex = 0;

 public OperateOrderNoIndexRepeatable(int length) {

  datas = new int[length];

 }

 private void insert(int data){

  // 假設為升序

  int i = 0;

  // 1:查找資料data的位置

  for (i = 0; i < currentIndex; i++) {

   if (datas[i] > data) {

    break;

   }

  }

  // 2:把這個位置及其後面的資料,向後移動以為

  for(int index = currentIndex;index>i;index--){

   datas[index] = datas[index-1];

  }

  // 3:把data設定到這個位置

  datas[i] = data;

  currentIndex++;

 }

 private int getIndex(int begin,int data){

  int index =-1;

  //1:周遊數組中的資料

  for(int i=begin;i<currentIndex;i++){

   //2:如果找到,則傳回索引

   if(data==datas[i]){

    index = i;

    break;

   }

  }

  return index;

 }

 public void remove(int data){

  //1:查找這個資料對應的索引

  int index = getIndex(0, data);

  //2:循環向後查找這個資料,直到找不到位置

  while(index>=0){

   for(int i= index;i<currentIndex;i++){

    datas[i]=datas[i+1];

   }

   currentIndex--;

   index = getIndex(index, data);

  }

 }

 public List<Integer> searchOne(int data){

  List<Integer> retList = new ArrayList<Integer>();

  //1:查找這個資料對應的索引

  int index = this.getIndex(0,data);

  while(index >= 0){

   //2:如果有,就加入到要傳回的集合中

   retList.add(datas[index]);

   //再次查找後續的資料對應的索引

   index = this.getIndex(index+1,data);

  }

  return retList;

 } 

 public void printDatas(){

  System.out.println("======================================>");

  for(int d : datas){

   System.out.println(d);

  }

 }

 public static void main(String[] args) {

  OperateOrderNoIndexRepeatable t = new OperateOrderNoIndexRepeatable(10);

  t.insert(3);

  t.insert(6);

  t.insert(1);

  t.insert(2);

  t.insert(2);

  t.insert(6);

  t.printDatas();

 }

}