Мутирование в новый массив строк - PullRequest
0 голосов
/ 12 января 2019

Я делаю упражнение, которое говорит, что я должен ввести фразу и поместить ее в массив, затем я должен удалить все повторяющиеся символы и показать новую фразу. Я сделал это так, но я не знаю, как получить 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 голосов
/ 12 января 2019

что-то вроде этого сделало бы это. Вам не нужно делать это таким образом ...

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

Выход:

а

Метод только с массивом

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

0 голосов
/ 12 января 2019

Причина, по которой вы получаете 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);
0 голосов
/ 12 января 2019

Основная проблема заключается в том, что вы используете массивы строк. Это неуместно, потому что вы пытаетесь выполнить итерацию символов строки.

Вам нужно создать свой массив символов следующим образом:

char[] phraseArray = phrase.ToCharArray();

Это должно позволить вам выполнять итерацию набора символов, проверять наличие дубликатов и формировать новый массив символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...