Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扭曲排序_Java_Sorting - Fatal编程技术网

Java 扭曲排序

Java 扭曲排序,java,sorting,Java,Sorting,我有一个由六项组成的数组(表示一个事物的结构): 我还有一个变量,我用它来做开关。这告诉我哪个“东西”应该放在第一位 ENUM positionDesignation {first=0,second=1 ...sixth=5} //declared a little different. 当用户选择不同的位置(例如3)时,“事物”应按以下顺序排序: thing3 thing4 thing5 thing1 thing2 我已经弄明白了。问题是,每个“事物”都有一个属性status。如果状态已损

我有一个由六项组成的数组(表示一个事物的结构):

我还有一个变量,我用它来做开关。这告诉我哪个“东西”应该放在第一位

ENUM positionDesignation {first=0,second=1 ...sixth=5} 
//declared a little different.
当用户选择不同的位置(例如3)时,“事物”应按以下顺序排序:

  • thing3
  • thing4
  • thing5
  • thing1
  • thing2
  • 我已经弄明白了。问题是,每个“事物”都有一个属性
    status
    。如果
    状态
    已损坏,则我需要将其推到末端并进行调整

    示例:
    thing4
    损坏的
    thing1
    第一个

    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;
            }
        }
    }
    
    第二部分是这样的:

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

    因此,似乎我可以轻松地检查数组的两端。我基本上是从“主”选择器的索引开始的。一旦我得到这个,我就抵消了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;
      }
    

    这些变量是否具有某种唯一的值,与您可以用来相互比较的数字相等?也许你可以使用一个特定的比较器实例来使用。是的,他们可以。他们有一个名称/名称的枚举。所以这就像[n].getDesignation.getOrdinal()一样,问题是我需要给它们赋值(枚举值),以便它们按顺序排列。因此,它们各自的旋转顺序属性(ENUM)反映了它们所处的顺序的哪一部分,。此外,如果他们停止服务,我必须调整订单。好吧,那我想我帮不了什么忙,对不起,祝你好运!