用C#交替排序或重新排序列表
本文关键字:排序 列表 新排序 | 更新日期: 2023-09-27 18:19:26
我有一个数字1和0的列表,它们的固定大小只有25。
示例:
List<int>() { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
我需要重新排序或排序列表到:
模式A:
List<int>() { 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
或
模式B:
List<int>() { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 };
列表中"1"的最大数量将始终小于13。如果当前索引为"0"(仅从左开始或从右开始),则列表将循环并搜索最近的"1",并替换为当前索引。
以下是我生成上述两种模式的代码片段:
List SlotMapLP1=new List(){0,1,1,1,2,1,1,1,0,1,0,0,0,0:0,0,0,0;
int i = 0, j = 0, k = 0, waferCount = 0, loopCtr = 0;
for (i = 0; i < SlotMapLP1.Count; i++ )
{
if (SlotMapLP1[i] == 1)
waferCount++;
}
List<int> ptnOne = new List<int>(SlotMapLP1);
List<int> ptnTwo = new List<int>(SlotMapLP1);
j = ptnOne.Count - 1;
while (j >= 0 && loopCtr <= waferCount) //list will start to traverse from right to left
{
if ((ptnOne[j] == 0 && (j + 1) % 2 > 0))
{
k = j - 1;
while (k >= 0)
{
if (ptnOne[k] == 1 && (ptnOne[k] != ptnOne[j]))
{
ExtensionMethods.Swap(ptnOne, k, j); //swap the two items
loopCtr++;
break;
}
k--;
}
}
else
{
if (j == 0 || j + 1 == ptnOne.Count) break;
if (ptnOne[j - 1] == 0 && ptnOne[j + 1] == 1)
{
k = j - 1;
while (k >= 0)
{
if (ptnOne[k] == 0 && (ptnOne[k] != ptnOne[j]))
{
ExtensionMethods.Swap(ptnOne, j, k); //swap the two items
loopCtr++;
break;
}
k--;
}
}
else
{
k = j - 1;
while (k >= 0)
{
if (ptnOne[k] == 1 && (ptnOne[k] != ptnOne[j]))
{
ExtensionMethods.Swap(ptnOne, j, k); //swap the two items
loopCtr++;
break;
}
k--;
}
}
}
j--;
}
loopCtr = 0; j = 0; k = 0;
while (j < ptnTwo.Count && loopCtr <= waferCount)//list will start to traverse from left to right
{
if (ptnTwo[j] == 0 && (j + 1) % 2 > 0)
{
k = j + 1;
while (k < ptnTwo.Count)
{
if (ptnTwo[k] == 1 && (ptnTwo[k] != ptnTwo[j]))
{
ExtensionMethods.Swap(ptnTwo, j, k); //swap the two items
loopCtr++;
break;
}
k++;
}
}
else
{
if (j == 0 || j + 1 == ptnOne.Count) break;
if (ptnTwo[j + 1] == 0 && ptnTwo[j - 1] == 1)
{
k = j + 1;
while (k < ptnTwo.Count)
{
if (ptnTwo[k] == 0 && (ptnTwo[k] != ptnTwo[j]))
{
ExtensionMethods.Swap(ptnTwo, j, k); //swap the two items
loopCtr++;
break;
}
k++;
}
}
else
{
k = j + 1;
while (k < ptnTwo.Count)
{
if (ptnTwo[k] == 1 && (ptnTwo[k] != ptnTwo[j]))
{
ExtensionMethods.Swap(ptnTwo, j, k); //swap the two items
loopCtr++;
break;
}
k++;
}
}
}
j++;
}
然而,我确实面临一些问题。如果我使用这种方法,并不是所有的列表输入都可以交替排序或重新排序。
有没有更好的方式或方法来执行这种类型的排序?
有一个解决方案不涉及交换列表中的元素。你只需要弄清楚模式。
如果只有一个1:
1000000000000000000000000
有一个"1"后面跟着24个零。
如果有两个:
1010000000000000000000000
有一个"101"模式,后面跟着22个零。
看到我现在的处境了吗?
对于3个:
1010100000000000000000000
有一个"10101"模式,后面跟着20个零。
因此,你只需要计算1的数量,然后从中构建你的模式。然后算法变为:
- 设n=列表中的个数
- 如果没有1,则模式A和B都只有25个0
- 否则构建长度为n*2-1的交替模式
- 对于模式A,连接25-(n*2-1)个零和交替模式
- 对于模式B,将交替模式和25-(n*2-1)个零连接起来。(或模式A的反面)
如果大小实际上固定为25个项目,我认为计算1的数量并根据该数量构建新列表会更容易。
我用模式A和模式B进行了测试,但由于需要多次检查,这会使我的代码变得更长。我创建了一个新的模式,到目前为止,我测试它是最适合我的需要移动硬件的应用程序的。只是为了分享我的想法。
模式C:
List(){0,1,0,0,1、0、1,0、1、0,1;
以下是代码部分:
List<int> SlotMapLP1 = new List<int>();
for (int x = 0; x < 25; x++)
{
SlotMapLP1.Add(int.Parse(waferArrangement.Substring(x, 1))); //input string contains 1 and 0; where 1 should be max 12 count only
}
int i = 0, j = 0, k = 0, waferCount = 0;
for (i = 0; i < SlotMapLP1.Count; i++ )
if (SlotMapLP1[i] == 1)
waferCount++;
List<int> ptnOne = new List<int>(SlotMapLP1);
for (j = 0; j < ptnOne.Count; j++ )
{
if(j == 0 || j % 2 == 0)
{
if (ptnOne[j] == 1)
{
k = j + 1;
while (k < ptnOne.Count())
{
if (ptnOne[k] == 0)
{
ExtensionMethods.Swap(ptnOne, k, j); //swap position
break;
}
k++;
}
}
}
else
{
if (ptnOne[j] == 0)
{
k = j + 1;
while (k < ptnOne.Count())
{
if (ptnOne[k] == 1)
{
ExtensionMethods.Swap(ptnOne, k, j); //swap position
break;
}
k++;
}
}
}
}
我用几个输入进行了测试,排序/重新排序功能运行良好。