⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dualialienarray.java

📁 pso源程序
💻 JAVA
字号:
/**
 * Description: provide dual pointers, all the elements must be different, and
 *  each element value is belong to [0, elemSize-1]
 *
 * @ Author        Create/Modi     Note
 * Xiaofeng Xie    May 19, 2005
 */

package Global.basic.data.collection;

import java.util.*;
import Global.methods.*;

public class DualIAlienArray implements IDynamicICollectionEngine, IAlienICollectionEngine {
  //all the values are different to each others
  private int[] valueArray, indexArray;
  private int elemSize = 0;

  //temp value
  private int sqrtSize = 0;

  public DualIAlienArray(int maxSize) {
    setSize(maxSize);
  }

  public boolean isEmpty() {
    return elemSize==0;
  }

  public void setSize(int maxSize) {
    valueArray = new int[maxSize];
    indexArray = new int[maxSize];
    Arrays.fill(indexArray, -1);
    elemSize = 0;
    sqrtSize = (int)Math.sqrt(maxSize);
  }

  public void importDualIAlienArray(DualIAlienArray alienArray) {
    System.arraycopy(alienArray.valueArray, 0, this.valueArray, 0, valueArray.length);
    System.arraycopy(alienArray.indexArray, 0, this.indexArray, 0, valueArray.length);
    this.elemSize = alienArray.elemSize;
  }

  public void addElements(int[] dataV) {
    for(int i=0; i<dataV.length; i++) {
      addElement(dataV[i]);
    }
  }

  public void addSafeElements(int[] dataV, int startIndex, int endIndex) {
    System.arraycopy(dataV, startIndex, valueArray, elemSize, endIndex-startIndex);
    for (int i=startIndex; i<endIndex; i++) {
      indexArray[valueArray[elemSize]]=elemSize;
      elemSize++;
    }
  }

  public int getMaxSize() {
    return valueArray.length;
  }

  public boolean addUnsafeElement(int elemV) {
    if (!isValid(elemV)||elemSize>=getMaxSize()-1) {
      return false;
    }
    return addElement(elemV);
  }

  public boolean addElement(int elemV) {
    if (indexArray[elemV]!=-1) return false;
    valueArray[elemSize]=elemV;
    indexArray[elemV]=elemSize;
    elemSize++;
    return true;
  }

  public boolean isValid(int elemV) {
    return (elemV>=0 && elemV<getMaxSize());
  }

  public boolean removeElementAt(int elemID) {
    int elemV = getElementAt(elemID);
    if (elemV==-1) return false;
    return removeElement(elemV);
  }

  public boolean removeElement(int elemV) {
    int postSize = elemSize-1;
    if (postSize<0){
      return false;
    }
    if (this.getElementID(elemV)==-1) return false;
    valueArray[indexArray[elemV]]=valueArray[postSize];
    indexArray[valueArray[postSize]]=indexArray[elemV];
    indexArray[elemV] = -1;
    elemSize--;
    return true;
  }

  public int[] getValueArray() {
    return valueArray;
  }

  public int getElementAt(int elemID) {
    return valueArray[elemID];
  }

  public int getElementID(int elemV) {
    return indexArray[elemV];
  }

  public void stepClear() {
    for (int i=0; i<elemSize; i++) {
      indexArray[valueArray[i]]=-1;
    }
    elemSize = 0;
  }

  public void fullClear() {
    Arrays.fill(indexArray, -1);
    elemSize = 0;
  }
  public void clear() {
    if (elemSize<sqrtSize) {
      stepClear();
    } else {
      fullClear();
    }
  }

  public int getRandomElement() {
    return valueArray[RandomGenerator.intRangeRandom(elemSize)];
  }

  public int getSize() {
    return elemSize;
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -