Arhn - архитектура программирования

Удаление строки из массива строк по определенному индексу

Я пытаюсь написать алгоритм для удаления имени из списка имен по определенному индексу. Сначала я буду читать файл построчно. Файл будет таким:

amelie barbon cat dog thomas | 3
raty  pertw ituy |5

Теперь, например, мы видим первую строку, где у нас наконец есть три (3), поэтому здесь мы должны прочитать число, наконец, для каждой строки, это число blackNumber, так называемое, потому что после чтения этого числа мы должны удалить каждую строку по этому индексу одну за другой, пока у нас не останется 1 строка в массиве строк. И эта единственная оставшаяся строка является нашим ответом.

Например: Cat будет удалено в первой итерации, и список станет

amelie barbon dog thomas

Теперь будет удален dog, а затем thomas, после этих двух одинаковых удалений список будет таким:

 amelie barbon

До сих пор мой код работал нормально, но теперь мы должны удалить по индексу 3, но в списке есть только 2 элемента, поэтому следующий счетчик удаления должен начинаться так:

amelie(index:1)-> barbon(index:2)->amelie(index:3) 

А строку amelie надо удалить, что останется barbon в списке, вот и ответ. (Этот последний шаг, когда общее количество элементов списка меньше, чем blackNumber, тогда я не могу понять логику, как это сделать).

То, что я пробовал, приведено ниже: (что будет работать бесконечно, когда количество списков меньше blackNumber)

 class Program
    {
        static void Main(string[] args)
        {
            using (StreamReader reader = File.OpenText("C:\\Users\\Mohit\\Desktop\\PolmStudio Tasks\\anmeDelete\\anmeDelete\\file.txt"))

                while (!reader.EndOfStream)
                {
                    List<string> list = null;
                    string line = reader.ReadLine(); ;
                    if (null != line)
                    {
                        list = new List<string>();

                        string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries);
                        for (int i = 0; i < digits.Count() - 1; i++)
                        {
                            list.Add(digits[i]);
                        }
                        int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]) - 1;
                        do
                        {
                            for (int i = 0; i < list.Count(); i++)
                            {
                                if (i == blacknumber)
                                {
                                    list.RemoveAt(i);
                                }
                            }
                        } while (list.Count > 1);

                    }
                    foreach (string str in list)
                    {
                        Console.WriteLine(str);
                    }

                    Console.WriteLine("");
                }
            Console.ReadKey();
        }
    }

  • Вы должны уточнить, что индекс подразумевает массив, а не строку (строку файла). Нужно ли результату только одно имя, чтобы выжить? 14.11.2015

Ответы:


1

Я думаю, то, что вы ищете, это использование по модулю % элемента n на length

Поскольку вы делаете это со списком, вы можете кое-что сделать:
int listIndex = i % list.Count;

Я считаю, что это будет делать, как вам нужно. Модуль вернет оставшуюся часть деления, следовательно, индекс, который вы ищете.

14.11.2015

2

У меня есть более простое решение. Единственный случай, о котором я не знаю, исходя из вашего вопроса, - это что произойдет, если blackNumber равен 1. Будет ли ответом amelia или thomas?

Вот мой код

            var arr = new List<string>() { "amelie", "barbon", "cat", "dog", "thomas" };
            var goal = blackline - 2;
            if (goal > -1)
            {
                if (arr.Count > goal)
                {
                    Console.WriteLine(arr[goal]);
                }
                else
                {
                    Console.WriteLine(arr[arr.Count - 1]);
                }
            }
            else
            {                    
                Console.WriteLine(arr[0]); //if blackline is 1 and answer is suppose to be amelia
                //Console.WriteLine(arr[arr.Count - 1]); //If blackline is 1 and answer is suppose to be thomas
            }
14.11.2015

3

Просто измените внутренний цикл на следующий, и вы получите требуемый ответ:

do
{
    int i =0;

    if (blacknumber >= list.Count()) i = blacknumber % list.Count();
    else i = blacknumber;

    list.RemoveAt(i);
} while (list.Count > 1);
14.11.2015
  • Я согласен с М.казем Ахгари. Я обновлю фрагмент кода. 14.11.2015

  • 4

    Спасибо за данное предложение и решение. Ваше предложение дало мне представление о том, что я не могу изменить положение элементов списка, которые должны быть удалены, но я могу изменить черный номер с помощью оператора %, поэтому многие друзья дали мне представление о том, как это сделать благодаря им, но в каждом алгоритме отсутствует какое-то условие. Ниже приведено рабочее решение, в котором реализованы все необходимые условия:

     string line = reader.ReadLine();
                        if (null != line)
                        {
                            list = new List<string>();
    
                            string[] digits = line.Split(new char[] { ' ', '\n', '|' }, StringSplitOptions.RemoveEmptyEntries);
                            for (int i = 0; i < digits.Count() - 1; i++)
                            {
                                list.Add(digits[i]);
                            }
                            int blacknumber = Convert.ToInt32(digits[digits.Count() - 1]);
                            int saveBlackNum = blacknumber;
                            do
                            {
                                for (int i = 0; i < list.Count(); i++)
                                {
                                    if ((list.Count < (blacknumber)))
                                    {
                                        if(blacknumber % list.Count==0 )
                                        {
                                            blacknumber = list.Count();
                                        }
                                        else
                                        {
                                            blacknumber = ((blacknumber) % list.Count());
                                        }                                  
                                        break;
                                    }
                                    if ((list.Count >= (blacknumber)))
                                    {
                                        if (i == blacknumber - 1)
                                        {
                                            list.RemoveAt(blacknumber - 1);
                                            blacknumber = saveBlackNum;
                                            break;
                                        }
                                    }
                                }
                            } while (list.Count > 1);
    
                        }
                        foreach (string str in list)
                        {
                            Console.WriteLine(str);
                        }
                        Console.WriteLine("");
    

    Может быть кому-то еще пригодится в будущем.

    15.11.2015

    5

    Это простая математика. предположим, что длина вашего списка равна 3. и вы хотите удалить элемент 5th.

    5 % (3 - 1) = 1. поэтому вы должны удалить элемент с индексом 1, т.е. элемент 2nd.

    Если индекс элемента, который вы пытаетесь удалить, меньше количества элементов в списке, вы просто удаляете его.

    List<string> list = new List<string>{"amelie", "barbon", "cat", "dog", "thomas"};
    
    int blacknumber = 3;
    blacknumber--; // because indexes are 0 based
    
    do
    {
        list.RemoveAt(blacknumber < list.Count ? blacknumber : blacknumber % list.Count);
    } while (list.Count > 1);
    
    
    Console.WriteLine(list[0]); // prints barbon
    

    Примечание:

    Не используйте Count(), потому что он вызывает Enumerable.Count из linq. это не оптимально. вы можете напрямую использовать свойство list. с list.Count (без скобок.)

    14.11.2015
  • Enumerable.Count() оптимален для всего, что реализует ICollection<T> или ICollection, включая массивы и списки. Это медленно только для объектов, которые реализуют только IEnumerable<T> или IEnumerable. Другими словами, Enumerable.Count() всегда равно лучший выбор. 14.11.2015
  • @ M.Kazem, спасибо за ответ, вы дали мне идею сделать ... но ваш алгоритм нарушит условие, например, когда blackNumber = 6 и количество в списке = 3, мы получим 6% 3 = 0, поэтому blackNumber будет Теперь «0», тогда как для удаления элемента под третьим номером должно быть «3», ниже я привожу решение, которое полностью заполнит все условия. Еще раз большое спасибо за руководство и ответ. 15.11.2015
  • @ изо всех сил, я кое-что забыл. Когда вы говорите blacknumber = 3, вы хотите удалить 3-й элемент, но обратите внимание, что индексы основаны на 0. Таким образом, вы должны удалить по индексу 2, чтобы удалить 3-й элемент. Смотрите отредактированный код. Теперь это должно работать для любого случая. 15.11.2015

  • 6

    Мне трудно понять, чего вы хотите, это то, что вы хотите? Чтобы остановить удаление элементов, если в этой строке меньше элементов, чем черное число? 'if (i == blacknumber && list.Count >= blacknumber)'

    14.11.2015
  • пожалуйста, сначала поймите код, мой код уже удаляет элемент списка по 3-му индексу, но после удаления, когда элементы меньше, чем blackNumber, он не может найти 3-й индекс и работает бесконечно. 14.11.2015
  • Похоже, я правильно вас понимаю, и вышеизложенное должно работать, потому что каждый раз, прежде чем вы перемещаете элемент, он будет проверять, достаточно ли элементов для удаления. 14.11.2015
  • Ага, понятно. Удалить в то время как list.Count ›1, потому что это то, что заставляет его работать вечно. 14.11.2015
  • У вас есть цикл for внутри цикла do while. Вам нужно только одно или другое, и в любом случае вам нужно добавить «list.Count ›= blacknumber» либо в цикле while, либо в операторе if в цикле for. 14.11.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..