突变为新的字符串数组

时间:2019-01-12 00:24:16

标签: c# arrays string

我正在做一个练习,说我必须输入一个短语并将其放入数组中,然后我必须删除所有重复的字符并显示新短语。 我是这样做的,但是我不知道如何从字符串数组中获取char并将其放入另一个字符串数组中。

PS:我只能使用C#和数组的基础知识:(

namespace Exercice3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Entrez une phrase SVP!!");
            string phrase = Console.ReadLine();
            string[] phraseArray = new string[]{ phrase };
            string[] newPhrase = new string[phrase.Length];

            for (int i = 0; i <= phrase.Length - 1; i++)
            {
                for (int j = 1; j <= phrase.Length - 1; j++)
                {
                    if (phraseArray[i] != phraseArray[j])
                        newPhrase = phraseArray[i]; //Probleme here 
                }
            }
            Console.WriteLine(newPhrase);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

这里的主要问题是您正在使用字符串数组。这是不合适的,因为您试图迭代字符串的字符

您需要像这样构造字符数组:

char[] phraseArray = phrase.ToCharArray();

这应该使您能够迭代字符集,检查重复项并形成新的字符数组。

答案 1 :(得分:0)

类似的事情会做到的。您不必这样做...

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var newColl = new List<char>();

        foreach(char c in "aaabbbccc".ToCharArray())
        {
            if (!newColl.Contains(c))
                newColl.Add(c);
        }
        Console.WriteLine(new string(newColl.ToArray()));
    }
}

输出:

  

abc

仅数组方法

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        const string orig = "aaabbbcccddd";
        int origLen = orig.Length;
        char[] newArr = new char[origLen]; // get max possible spots in arr
        int newCount = 0;


        for(int i = 0; i < origLen; i++)
        {
            bool yes = false;

            for(int j = 0; j < newCount + 1; j++)
            {

                if (newArr[j] == orig[i])
                {    
                    yes = true;
                    break;
                }

            }

            if (!yes)
            {
                newArr[newCount] = orig[i];
                newCount++;
            }
        }
        Console.WriteLine(new string(newArr));
    }
}

输出:

  

abcd

答案 2 :(得分:0)

获得IndexOutOfRangeException的原因是因为如果您查看两个数组:

string[] phraseArray = new string[]{ phrase };

还有

string[] newPhrase = new string[phrase.Length];

两个数组的长度完全不同,phraseArray的长度为1,并且newPhrase将设置为短语的长度,因此,如果您插入的世界超过1个字符,则两个数组将不匹配然后:

if (phraseArray[i] != phraseArray[j]) 

newPhrase = phraseArray[i]; 

将失败,特别是newPhrase = phraseArray[i];,因为在这里您尝试将newPhrase的数组替换为字符phrase[i]。基本上,您的解决方案将无法正常工作。因此,您可以做的是 @Travis 建议的操作,基本上将阵列从String[]更改为char[],然后:

char[] phraseArray = phrase.ToCharArray();

或者您可以使用另一个字符串来过滤短语,而不是使用数组。第一个字符串是您的短语,第二个字符串是您要添加非重复字符的字符串。基本上是这样:

Console.WriteLine("Entrez une phrase SVP!!");
string phrase = Console.ReadLine();
string newPhrase = ""; 

// loop through each character in phrase        
for (int i = 0; i < phrase.Length; i++) {
   // We check if the character of phrease is within our newPhrase, if it isn't we add it, otherwise do nothing
   if (newPhrase.IndexOf(phrase[i]) == -1) 
        newPhrase += phrase[i]; // here we add it to newPhrase
}

Console.WriteLine(newPhrase);

别忘了阅读代码中的注释。

修改:

基于给出的评论和建议,我实施了类似的解决方案:

Console.WriteLine("Entrez une phrase SVP!!");
char[] phrase = Console.ReadLine().ToCharArray();
char[] newPhrase = new char[phrase.Length]; 
int index = 0;

// loop through each character in phrase        
for (int i = 0; i < phrase.Length; i++) {
  // We check if the character of phrease is within our newPhrase, if it isn't we add it, otherwise do nothing
  if (Array.IndexOf(newPhrase, phrase[i]) == -1) 
      newPhrase[index++] = phrase[i]; // here we add it to newPhrase
}

Console.WriteLine(newPhrase);