编写removeLast方法

时间:2014-11-02 15:27:32

标签: c# arrays

情况:

我是c#的新手,目前正在学习绳索,同时也在研究我的数据结构,我决定创建一个能够为线性阵列执行多个功能的课程,因为它建议给我我应该从线性阵列开始,然后在圆形阵列上工作。

我班级目前提供的方法是:

  • 将项添加到数组的最前面位置
  • 将项添加到数组的最后面位置
  • 删除数组中的第一项
  • 删除数组中的最后一项 // todo
  • 清除其值的当前数组列表,
  • 向用户显示数组列表内容。

问题:

我在构建一个删除数组最后一项的方法时遇到了困难,我已经在网上查看,预先编写的方法似乎很复杂,我无法理解它们我的经验。我意识到其他人写这样的方法一定很容易,但我真的很难过。

我想学习如何以最简单易懂的方式编写一个删除数组中最后一个值的方法。这是我的LinearArrayList类的当前代码。

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace arraydatastructuresactual
{
    public class LinearArrayList
    {
        private int count;  //how many numbers currently stored
        private int[] values;  //array to hold values entered into list

        //constructors

        /// <summary>
        /// //creates a linear array that can hold max values
        /// </summary>
        /// <param name="max"></param>
        public LinearArrayList(int max)
        {
            count = 0;

            values = new int[max]; //makes the linear array as big as the max value
        }

        /// <summary>
        /// //default constructor sets capacity to 10
        /// </summary>
        public LinearArrayList()
        {
            count = 0;

            values = new int[10];
        }

        /// <summary>
        /// returns true if list is empty
        /// otherwise turns false
        /// </summary>
        /// <returns>true if empty otherwise false</returns>
        public bool isEmpty()
        {
            return (count == 0);
        }
        /// <summary>
        /// returns true if list is full
        /// otherwise turns false
        /// </summary>
        /// <returns>true if full otherwise false</returns>
        public bool isFull()
        {
            return (values.Length <= count);

        }
        /// <summary>
        /// if not full adds value to the end of list
        /// throws exception if list is fulll
        /// </summary>
        /// <param name="value">value to add to end of list</param>
        public void addLast(int value) //adds an item to the last position in the array.
        {
            if (isFull())
            {
                throw new Exception("List Full");
            }
            else
            {
                values[count++] = value;
            }
        }

        public void addFirst(int value) //Adds an item to the first position in the array.
        {
            if (isFull())
            {
                throw new Exception("List Full");
            }
            else
            {

                for (int i = count; i > 0; i--)
                {
                    values[i] = values[i--];
                }
                values[0] = value;
                count++;

            }
        }

        public int removeFirst() //removes the first item from the array
        {
            if (isEmpty())
                throw new Exception("List is Empty");

            int value = values[0];
            count--;
            for (int i = 0; i < count; i++)
            {
                values[i] = values[i + 1];
            }

            return value;
        }

        public int removeLast() //todo //removes the last item from the array
        {
            if (isEmpty())
                throw new Exception("List is Empty");

            int value = values[0];
            count--;
            for (int i = count; i < count; i++)
            {
                values[i] = values[i + 1];
            }

            return value;
        }


        public void displayUI()//displays contents of list
        {

        }
        public void destroy() //Empties The List
        {

        }

    }
}

如果有人可以就我如何实现这一目标分享他们的经验,那么非常感谢,我试图重新使用我的removeFirst方法,但我搞砸了,试图这样做了几次我和我现在完全难倒了。

3 个答案:

答案 0 :(得分:1)

Sybren回答的另一种选择:

int lastValue = values[values.Length - 1];
int[] newValues = new int[values.Length - 1];
Array.Copy(values, newValues, newValues.Length);
values = newValues;
return lastValue;

int lastValue = values[values.Length - 1];
Array.Resize(values, values.Length - 1);
return lastValue;

如果您不想使用Array类的任何现有方法,您还可以:

int lastValue = values[values.Length - 1];
int[] newValues = new int[values.Length - 1];
for (int i = 0; i < newValues.Length; i++)
{
    newValues[i] = values[i];
}
values = newValues;
return lastValue;

修改

忘掉这一点,做@Steve说的话。

答案 1 :(得分:1)

你只需要写

public int removeLast() 
{
    if (isEmpty())
        throw new Exception("List is Empty");

    count--;
    return values[count];
}

这将返回values数组中的最后一项而不改变其大小,但递减跟踪实际插入数组中的项的变量。
请注意,我不会尝试更改count变量指向的位置中的值。它仍然存在,直到你覆盖它添加另一个值

所以你仍然可以写这个

// Creates an array with space for 10 ints 
LinearArrayList la = new LinearArrayList();
la.addLast(34);   
la.addLast(23);   
la.addLast(56);   
la.addLast(467);
la.addLast(43);
la.addLast(666);
la.addLast(7989);
la.addLast(82);
la.addLast(569);
la.addLast(100);  
int value = la.removeLast();

// This will work because you still have a slot free in the 10 ints array 
la.addLast(1110);

// While this will fail because the array has now all slots filled
la.addLast(9435);

答案 2 :(得分:0)

这是一种方法。您正在将数组转换为列表,从列表中获取最后一个元素,从列表中删除最后一个元素,然后将其转换回数组。

    var numbersList = values.ToList();
    var last = numbersList.Last();
    numbersList.Remove(last);
    values = numbersList.ToArray();
    return last;