Сортировка с изюминкой - PullRequest
       4

Сортировка с изюминкой

0 голосов
/ 10 февраля 2019

У меня есть массив из шести элементов (структур, которые представляют вещь):

thing[] = new thing{thing1,thing2,thing3,thing4,thing5,thing6};

У меня есть другая переменная, которую я использую для переключателя.Это говорит мне, какая «вещь» должна быть на первой позиции.

ENUM positionDesignation {first=0,second=1 ...sixth=5} 
//declared a little different.

Когда пользователь выбирает другую позицию, скажем, 3, тогда «вещи» должны быть отсортированы по:

  1. thing3
  2. thing4
  3. thing5
  4. thing1
  5. thing2

Я понял это.Проблема в том, что каждая «вещь» также имеет свойство status.Если status равно broken, то мне нужно нажать его до конца и настроить.

Пример: thing4 равно broken и thing1 равно first

thing = {
  thing1.first,
  thing2.second,
  thing3.third,
  thing4.sixth,
  thing5.fourth,
  thing6.fifth
};

Имеет ли это смысл?

Мой первый порядок выглядит так:

public void setRotationOrder() {
    Thing[] things = {
        getThing1(),
        getThing2(),
        getThing3(),
        getThing4(),
        getThing5(),
        getThing6()
    };

    int[] wheel = new int[6];
    int idx = getPrimary().getOrdinal();

    idx = (idx == 0) ? 5 : idx - 1;

    for (int i = 5; i >= 0; i--) {
        wheel[idx] = i;
        Thing[i].setState(Rotation6Designation.make(idx));
        idx = (idx == 0) ? 5 : idx - 1;
    }
}

Вторая часть выглядит следующим образом:

int lastIndex = 5;
int cnt = 0;
int thingPos = 0;

for (int i=5;i>=0;i--) {
    // Check thing at idx. If out of service, put it at the end.
    thingPos = wheel[i];

    if (things[thingPos].getStatus().equals(AlarmShutdown) ||
            things[thingPos].getStatus().equals(MaintenanceShutdown)) {
        if (i == lastIndex) {
            things[thingPos].setState(Rotation6Designation.make(lastIndex));
            lastIndex--;
            continue;
        }

        int tmpThingPos = thingPos;
        thingPos++;

        while (true) {
            things[thingPos].setState(things[thingPos + 1].getState());
            thingPos++;

            if (thingPos == lastIndex) {
                things[thingPos].setState(Rotation6Designation.make(tmpThingPos));
            }

            lastIndex--;
            break;
        }
    }
}

1 Ответ

0 голосов
/ 10 февраля 2019

Итак, кажется, что я мог бы легко проверить оба конца массива.Я в основном начал с индекса «основного» селектора.Как только я получил это, я сместил idxBack.Затем я зациклил и уменьшил задний индекс и увеличил передний индекс (idxBack).После проверки условий это было легко отрегулировано.Это сводило меня с ума в течение длительного времени.

 public void setRotationOrder(){
  Thing[] things = {getThing1(),getThing2(),getThing3(),getThing4(),getThing5(),getThing6()};
  int idxFront = getPrimary().getOrdinal(); //3
  int idxBack =(idxFront==0)?5:idxFront-1; //2

  int lastIndex =5;
  int firstIndex=0;
  for (int i =5 ;i>=0 ;i--){
    System.out.println("Last index: "+lastIndex+", First index: "+firstIndex);
    System.out.println("idxBack: "+idxBack+", idxFront: "+idxFront);
    //*********************NEW*******************************/

    if (things[idxBack].getStatus().equals(Mode.AlarmShutdown) ||
            things[idxBack].getStatus().equals(Mode.MaintenanceShutdown)) {
      things[idxBack].setState(RotationDesignation.make(lastIndex));
      System.out.println( "Broken: things["+idxBack+"] "+things[idxBack].getState());
      System.out.println( "things["+idxBack+"] "+things[idxBack].getStatus());
      lastIndex--;
    }
    if (!things[idxFront].getStatus().equals(Mode.AlarmShutdown) &&
            !things[idxFront].getStatus().equals(Mode.MaintenanceShutdown)) {
      things[idxFront].setState(RotationDesignation.make(firstIndex));
      System.out.println( "Not Broken: things["+idxFront+"] "+things[idxFront].getState());
      firstIndex++;

    }
    idxFront=(idxFront==5)?0:idxFront+1;
    idxBack=(idxBack==0)?5:idxBack-1;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...