dualialienarray.java

来自「用于求解TSP(Traveling salesman problem」· Java 代码 · 共 124 行

JAVA
124
字号
/**
 * 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;

  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;
  }

  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 clear() {
    if (elemSize!=0) {
      Arrays.fill(indexArray, -1);
      elemSize = 0;
    }
  }

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

  public int getSize() {
    return elemSize;
  }

}

⌨️ 快捷键说明

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