如何在c#sharp中将字符数组中的字符向左和向右移动
伙计们!我遇到这种情况:给定一个字符串和两个以上的字符X和Y。将所有X字符移动到字符串的开头,将所有Y字符移动到字符串的结尾。字符串中其他字符的顺序保持不变。 我编写了两个函数MoveCharsLeft和MoveCharsRight来向左移动X,向右移动Y,但是系统出现了一个错误System.IndexAutoFrangException:“索引超出了数组的边界。”在这行代码上char-toReplace=splitText[charToCheck]我不知道如何处理它,以便解决这个练习。 你们能帮我吗,功能应该是怎样的如何在c#sharp中将字符数组中的字符向左和向右移动,c#,arrays,string,char,swap,C#,Arrays,String,Char,Swap,伙计们!我遇到这种情况:给定一个字符串和两个以上的字符X和Y。将所有X字符移动到字符串的开头,将所有Y字符移动到字符串的结尾。字符串中其他字符的顺序保持不变。 我编写了两个函数MoveCharsLeft和MoveCharsRight来向左移动X,向右移动Y,但是系统出现了一个错误System.IndexAutoFrangException:“索引超出了数组的边界。”在这行代码上char-toReplace=splitText[charToCheck]我不知道如何处理它,以便解决这个练习。 你们能
static void Main()
{
string text = Console.ReadLine();
char[] splitText = text.ToCharArray();
string firstLetter = Console.ReadLine();
char[] firstChar = firstLetter.ToCharArray();
string secondLetter = Console.ReadLine();
char[] secondChar = secondLetter.ToCharArray();
char one = firstChar[0];
char two = secondChar[0];
Console.WriteLine(CheckChars(splitText, one, two));
Console.ReadLine();
}
static char[] CheckChars(char[] splitText, char one, char two)
{
for (char letter = 'a'; letter <= 'z'; letter++)
{
if (Array.IndexOf(splitText, one) > -1)
{
MoveCharsLeft(splitText, one);
}
if (Array.IndexOf(splitText, two) > -1)
{
MoveCharsRight(splitText, two);
}
}
return splitText;
}
static void MoveCharsLeft(char[] splitText, char charToCheck)
{
char toReplace = splitText[charToCheck];
char currentLetter = splitText[0];
for (int i = 0; i <= charToCheck; i++)
{
char temporary = splitText[i];
splitText[i] = currentLetter;
currentLetter = temporary;
}
splitText[0] = toReplace;
}
static void MoveCharsRight(char[] splitText, char charToCheck)
{
char toReplace = splitText[charToCheck];
char currentLetter = splitText[-1];
for (int i = 0; i <= charToCheck; i++)
{
char temporary = splitText[i];
splitText[i] = currentLetter;
currentLetter = temporary;
}
splitText[-1] = toReplace;
}
static void Main()
{
string text=Console.ReadLine();
char[]splitText=text.ToCharArray();
string firstLetter=Console.ReadLine();
char[]firstChar=firstLetter.ToCharArray();
字符串secondLetter=Console.ReadLine();
char[]secondChar=secondLetter.tocharray();
char one=firstChar[0];
char two=secondChar[0];
Console.WriteLine(CheckChars(splitText,一,二));
Console.ReadLine();
}
静态字符[]检查字符(字符[]拆分文本,字符一,字符二)
{
for(字符字母='a';字母-1)
{
MoveCharsLeft(拆分文本,一个);
}
if(Array.IndexOf(splitText,two)>-1)
{
MoveCharsRight(拆分文本,两个);
}
}
返回拆分文本;
}
静态void MoveCharsLeft(char[]splitText,char charToCheck)
{
char-toReplace=splitText[charToCheck];
char currentLetter=splitText[0];
对于(int i=0;i您没有检查您的边界。我想说CheckChars
方法是多余的,在MoveCharsLeft
和MoveCharsRight
中,您没有检查您是否仍在splitText
中
下面是我将如何实现的MoveCharsLeft
,我希望它能引导您朝着正确的方向前进
char[] MoveCharactersLeft(char[] text, char character) {
var lowerCharacter = char.ToLower(character);
var left = new List<char>();
var right = new List<char>();
foreach (var letter in text) {
if (char.ToLower(letter) == lowerCharacter) {
left.Add(letter);
continue;
}
right.Add(letter);
}
left.AddRange(right);
return left.ToArray();
}
现在您已经拥有了这两个属性,您只需调用MoveCharsLeft
,然后在MoveCharactersRight
的结果上调用MoveCharsLeft,就可以在适当的位置交换它们,尽管这需要大量的复制。下面是一个函数,用于将字符从数组中的一个位置移动到另一个位置。您可以在在网络和网络上
通常的注意事项适用-这没有经过很好的测试,如果您使用它,您应该检查所有边缘情况。感谢您的解决方案,它适用于第一个用户的角色,但我认为您错过了第二个角色(Y)的部分从用户开始,它应该移到右边:将所有X字符移到字符串的开头,将所有Y字符移到字符串的结尾。你也能帮我吗?我在c#中看到负索引不存在。你只需要修改两行就可以得到它,但好的,我现在已经添加了它。你的解决方案非常有效,谢谢你的解决方案在…上
char[] MoveCharactersRight(char[] text, char character) {
var lowerCharacter = char.ToLower(character);
var left = new List<char>();
var right = new List<char>();
foreach (var letter in text) {
if (char.ToLower(letter) == lowerCharacter) {
right.Add(letter);
continue;
}
left.Add(letter);
}
left.AddRange(right);
return left.ToArray();
}
public static void Move(char[] buffer, int from, int too)
{
if (from == too)
return;
char temp = buffer[from];
if (too < from)
{
Array.Copy(buffer, too, buffer, too + 1, from - too);
}
else
{
Array.Copy(buffer, from + 1, buffer, from, too - from);
}
buffer[too] = temp;
}
public static void ArrangeChars(char[] buffer, char left, char right)
{
int leftIndex = 0;
int rightIndex = buffer.Length - 1;
int i = 0;
while(i <= rightIndex)
{
char ch = buffer[i];
if (ch == left && i > leftIndex)
Move(buffer, i, leftIndex++);
else if (ch == right && i < rightIndex)
Move(buffer, i, rightIndex--);
else
++i;
}
}
static void Main(string[] _)
{
char[] data = "test me and move".ToCharArray();
Console.WriteLine(new string(data));
ArrangeChars(data, 'e', 't');
Console.WriteLine("Move 'e' to start, move 't' to end");
Console.WriteLine(new string(data));
}