CustomList class,在指定索引处删除有什么好方法?
CustomList class, what is a good way to remove at a specified index?
我创建了一个 CustomList class,其中包含一些方法,例如 Add()、Set() 和 RemoveAt()。此 CustomList class 旨在模仿 List<> class 的行为,而无需实际使用它。
在调试我的程序时,我注意到当我输入要删除的字符串的索引时,我的代码成功删除了该字符串。但是当我调用 print 方法时,它会双重打印数组中的最后一个字符串。我假设错误在 RemoveAt() 而不是 Print() 内,因为当不调用 RemoveAt() 时 Print() 工作得很好。我想知道是否有人可以指出正确的方向。
class CustomList
{
private int count;
private String[] data;
public int Count
{
get { return count; }
set { value = count; }
}
public CustomList(int arrayNum)
{
data = new String[arrayNum];
}
public CustomList(): this(4)
{
}
public void Add (String item)
{
if (count > data.Length)
{
String[] temp = new String[count * 2];
for (int i = 0; i < data.Length; i++)
{
temp[i] = data[i];
}
data = temp;
}
data[count] = item;
count++;
}
public int IndexOf (String item)
{
for (int i = 0; i < data.Length; i++)
{
if (data[i].Contains(item))
{
return i;
}
}
return -1;
}
public bool Contains (String item)
{
if (IndexOf(item) == -1)
{
return false;
}
return true;
}
public void RemoveAt(int index)
{
if (index < count && index >= 0)
{
Array.Copy(data, index + 1, data, index, Count - (index + 1));
count--;
}
}
public bool Remove(String item)
{
if (data.Contains(item))
{
int index = Array.IndexOf(data, item);
RemoveAt(index);
return true;
}
return false;
}
public void Print()
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(data[i]);
}
}
@germi,我对你所说的有点困惑。当我将大小设置为 4 并输入 4 个字符串时,它成功打印了数组中的 4 个项目:
您的打印循环应该从 0 到 count-1
,而不是从 0 到 count
。如果您有 3 个项目 (count == 3
),那么这些项目的索引为 0、1、2。
由于您实施 Remove
的方式,您只能访问过多的项目,这不会缩小数组(因此仍然有一个现在未使用的元素位于那个索引)。
将 <=
更改为 <
。
此外,RemoveAt
方法应该 count--
,而不是 Count--
。
我创建了一个 CustomList class,其中包含一些方法,例如 Add()、Set() 和 RemoveAt()。此 CustomList class 旨在模仿 List<> class 的行为,而无需实际使用它。 在调试我的程序时,我注意到当我输入要删除的字符串的索引时,我的代码成功删除了该字符串。但是当我调用 print 方法时,它会双重打印数组中的最后一个字符串。我假设错误在 RemoveAt() 而不是 Print() 内,因为当不调用 RemoveAt() 时 Print() 工作得很好。我想知道是否有人可以指出正确的方向。
class CustomList
{
private int count;
private String[] data;
public int Count
{
get { return count; }
set { value = count; }
}
public CustomList(int arrayNum)
{
data = new String[arrayNum];
}
public CustomList(): this(4)
{
}
public void Add (String item)
{
if (count > data.Length)
{
String[] temp = new String[count * 2];
for (int i = 0; i < data.Length; i++)
{
temp[i] = data[i];
}
data = temp;
}
data[count] = item;
count++;
}
public int IndexOf (String item)
{
for (int i = 0; i < data.Length; i++)
{
if (data[i].Contains(item))
{
return i;
}
}
return -1;
}
public bool Contains (String item)
{
if (IndexOf(item) == -1)
{
return false;
}
return true;
}
public void RemoveAt(int index)
{
if (index < count && index >= 0)
{
Array.Copy(data, index + 1, data, index, Count - (index + 1));
count--;
}
}
public bool Remove(String item)
{
if (data.Contains(item))
{
int index = Array.IndexOf(data, item);
RemoveAt(index);
return true;
}
return false;
}
public void Print()
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(data[i]);
}
}
@germi,我对你所说的有点困惑。当我将大小设置为 4 并输入 4 个字符串时,它成功打印了数组中的 4 个项目:
您的打印循环应该从 0 到 count-1
,而不是从 0 到 count
。如果您有 3 个项目 (count == 3
),那么这些项目的索引为 0、1、2。
由于您实施 Remove
的方式,您只能访问过多的项目,这不会缩小数组(因此仍然有一个现在未使用的元素位于那个索引)。
将 <=
更改为 <
。
此外,RemoveAt
方法应该 count--
,而不是 Count--
。