C # вставка чисел в список в отсортированном положении - PullRequest
0 голосов
/ 09 ноября 2018

Извините, пожалуйста, мой первый пост. У меня проблема с назначением в университет. Назначением является «Диспетчер списка номеров», в основном пользователь выбирает переключатель (отсортированный или не отсортированный), и при нажатии на кнопку 30 номеров будут добавлены в список, соответствующий выбору пользователя. У меня нет проблем с несортированным кодом. Лектор особенно хочет, чтобы мы добавили отсортированные номера в список и отсортировали их по мере их добавления, а не генерировали весь список и затем сортировали его.

if (radUnsorted.Checked == true)//if unsorted
{
    RunChecks();
    do
    {
        numberToInput = (rnd.Next(0, 100));//sets number to input to random number
        int i = 1;

        while (i < lstNumbers.Items.Count)//loops though whole list
        {
            if (numberToInput == ConvertToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
            {
                numberToInput = (rnd.Next(0, 101));//genrate new random number
                i = 0;//set to 0 to restart checking through the list
            }
            else//if the number isnt at i index
            {
                i++;//move onto next number
            }
        }

        lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
        RunChecks();//check if the list is full

    } while (spaceLeft == true);//keep looping untill list is full
}

Это мой код для добавления номеров в список в несортированной позиции. Я пробовал смотреть онлайн, но единственный метод, который я вижу, это цикл for для добавления чисел в список, а затем другой цикл for для их сортировки.

Вот фрагмент критериев: Вы должны манипулировать списком во время вставок и удалений, используя свой собственный код, и не должны использовать методы C #, которые выполняют задачу автоматически, например, вставка в несортированный список просто требует, чтобы новое значение было помещено в следующее доступное место после текущей последней записи, в то время как вставка в отсортированный список требует, чтобы ваш код обнаружил точку вставки и переместил любые записи с более высокими значениями, чтобы открыть / освободить вставку пункт для включения нового значения.

Я не прошу никого делать эту работу за меня, но даже псевдокод был бы очень признателен

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Хорошо, во-первых, я не уверен, в чем суть этих проверок для заполнения списка. Разве вы не можете просто очищать элементы каждый раз, когда нажимаете кнопку и повторять от 1 до 30?

В любом случае, вот код, который я выбрал для сортировки и несортировки:

private void unsorted_Click(object sender, EventArgs e)
{
    lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
    var rand = new Random();
    for (var i = 0; i < 30; i++)
    {
        var randNumber = rand.Next(0, 100);
        while (lstNumbers.Items.Contains(randNumber))
        {
            //generate new number until it's unique to the list.
            randNumber = rand.Next(0, 100);
        }
        lstNumbers.Items.Add(randNumber);
    }
}

private void sorted_Click(object sender, EventArgs e)
{
    lstNumbers.Items.Clear(); //clear any existing numbers, and add a new 30.
    var rand = new Random();
    for (var i = 0; i < 30; i++)
    {
        var randNumber = rand.Next(0, 100);
        while (lstNumbers.Items.Contains(randNumber))
        {
            //generate new number until it's unique to the list.
            randNumber = rand.Next(0, 100);
        }

        if (lstNumbers.Items.Count == 0)
        {
            //we have no items, obviously the default position would be 0.
            lstNumbers.Items.Add(randNumber);
            continue; //next iteration
        }

        //find out the sorted position
        var bestPos = 0;
        for (var j = 0; j < lstNumbers.Items.Count; j++) //loop through the current list.
        {
            var currValue = Convert.ToInt32(lstNumbers.Items[j]);
            if (randNumber > currValue)
            {
                bestPos = j + 1;
            }
            else
            {
                bestPos = j;
                break; //we no longer need to check, it will never be any less than this.
            }
        }
        if (bestPos < 0)
            bestPos = 0;
        lstNumbers.Items.Insert(bestPos, randNumber);
    }
}
0 голосов
/ 09 ноября 2018

Я делаю, возможно, более простой способ решить эту проблему, используя SortedList .

SortedList<int, object> sortedList = new SortedList<int, object>();

sortedList.Add(4, null);
sortedList.Add(1, null);
sortedList.Add(7, null);

foreach(KeyValuePair<int, object> k in sortedList)
{
    Console.WriteLine(k.Key);
}
0 голосов
/ 09 ноября 2018

Вы уже просматриваете список и читаете каждое значение, поэтому все, что вам нужно сделать, это проверить, больше ли существующее значение, чем то, которое вы вставляете. Если да, вставьте его перед проверенным элементом.

            var inserted = false;
            while (i < lstNumbers.Items.Count)//loops though whole list
            {
                if (numberToInput == Convert.ToInt32(lstNumbers.Items[i]))//checks that number doesnt already exist in list
                {
                    numberToInput = (rnd.Next(0, 101));//genrate new random number
                    i = 0;//set to 0 to restart checking through the list
                }
                else if (numberToInput < Convert.ToInt32(lstNumbers.Items[i])
                {
                    lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
                    inserted = true;
                } 
                else//if the number isnt at i index
                {
                    i++;//move onto next number
                }
            }

            if (!inserted)
            { 
                lstNumbers.Items.Insert(i - 1, numberToInput);//insert the number
            }

Обратите внимание на проверку того, когда новый элемент должен идти в конце списка.

Я думаю, это то, чего хочет ваш учитель, и важно понимать, как работать с массивами, но на самом деле лучший способ сортировки списка в C # - это не использовать массив, а List или другой класс, который имеет свой собственный метод сортировки.

        var myList = new List<int>();
        myList.Add(5);
        myList.Add(3);
        myList.Add(1);

        myList.Sort();

Это было бы быстрее и эффективнее, если бы у вас было миллион предметов, и это работало бы для строк, дат или чего-то еще.

List также имеет метод Contains и несколько других ярлыков, облегчающих жизнь. @ThePerplexedOne прав в том, что при сортировке после заполнения списка вы можете использовать SortedList , который автоматически вставит элементы в нужное место.

...