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)反映了它们所处的顺序的哪一部分,。此外,如果他们停止服务,我必须调整订单。好吧,那我想我帮不了什么忙,对不起,祝你好运!