我创建了一个程序,用户输入的命令是:向数组添加数字或从数组中删除元素或打印数组。数组大小为10.
这是测试人员类,
import java.util.Scanner;
public class Assignment7 {
public static void main (String [] args) {
Scanner scan = new Scanner (System.in);
final int MAX = 10;
Numbers nums = new Numbers(MAX);
char command;
int value;
System.out.println
("To add an element into the array, type a.");
System.out.println
("To delete an element from the array, type d.");
System.out.println
("To print the current contents of the array, type p.");
System.out.println
("To exit this program, type x.\n");
System.out.print
("Add (a), delete (d), print (p) or exit (x)?:");
command = scan.nextLine().charAt(0);
while (command != 'x') {
if (command == 'a' || command == 'd') {
System.out.print ("Enter a number: ");
value = scan.nextInt();
scan.nextLine();
if (command == 'a')nums.add(value);
else nums.delete(value);
}
else if (command == 'p') nums.print();
else System.out.println ("Not a value input");
System.out.print
("Add (a), delete (d), print (p) or exit (x)?: ");
command = scan.nextLine().charAt(0);
}
System.out.println ("Program Complete");
}
}
这是我的另一堂课,
import java.util.*;
public class Numbers{
private int[] nums;
private int size;
public Numbers(int _size){
this.nums = new int[_size];
}
public void add(int addnum){
if (size == nums.length)
{
System.out.println("Array is full. The value " +addnum + " cannot be added.");
}
else
{
nums[size] = addnum;
size += 1;
}
}
public void delete(int deleteNum){
if(search(deleteNum) == -1)
{
System.out.println("The value " + deleteNum + " was not found and cannot be deleted.");
}
else {
for (int i = nums[deleteNum]; i < nums.length -1; i++){
nums[i]= nums[i+1];
}
}
}
public void print(){
String output ="";
for(int str: nums){
output = output + " " + str;
}
System.out.println(output);
}
private int search(int x){
int index = 0;
while(index < size){
if(nums[index] == x)
return index;
index++;
}
return -1;
}
}
每次我运行程序并输入一个我要删除的号码时,它都不会删除它。它会删除索引中的数字。
例如,如果数组输入为1,2,3,4,5,6,7,8,9,10
并且我想删除数字1,则删除索引为1的值,该值将是数字2而不是数字1.
答案 0 :(得分:1)
我认为你的设计&#34;效率不高。因为在您的小程序中,您的数组大小在运行时会发生变化。你的删除方法也是&#34;很奇怪&#34;。
为什么效率不高?
您正在使用具有固定大小->
的静态数组,因此如果您想正确地使用#34;从中删除项目,您需要使用new(size - 1) 1 重新初始化新数组,这就是意大利面条代码操作。
什么是建议?
当你移除或添加新项目时,如何使用可以动态更改其大小的动态数组?它还提供了添加和删除等直接操作方法。
1 您需要重新初始化静态数组(新大小为1),因为如果您要删除&#34;删除&#34;例如2.来自它的项目它将仅被指定为零,因此整个数组看起来像:[1,0,3,4,5,6,7,8,9],期望的目标是[1,3,4] ,5,6,7,8,9]
答案 1 :(得分:1)
tl; dr:使用ArrayList,或将数组操作分离到自己的类中。
如果你想能够在列表中添加和删除,你很可能想要使用一个arraylist,它是一个“引擎盖下”的数组,但它支持动态大小。 使用数组而不是某种集合的最有效原因是出于学习目的,在这种情况下,您应该创建自己的“arraylist”,以便所有与add / deletion / etc相关的代码都包含在自己的类中。只要知道你的实现可能永远不会像ArrayList一样高效和健壮。
当删除元素时,您不需要“调整”数组的大小,只保留一个单独的大小变量,告诉您哪些indeces是“有效”。添加新元素时,如果已超出数组的长度,则必须初始化具有更大大小的新数组,并复制旧数组中的所有元素。
答案 2 :(得分:0)
在删除方法中,您应该存储从搜索方法中获得的值。现在你正在调用nums [deleteNum],它使用输入的数字作为索引。这就是为什么你有2个删除值的原因。你应该做这样的事情:
public static void delete(int deleteNum){
int index = search(deleteNum);
if(index == -1)
{
System.out.println("The value " + deleteNum + " was not found and cannot be deleted.");
}
else {
int size = nums.length;
for (int i = index; i < size; i++){
if(i < (size-1)
nums[i]= nums[i+1];
else
nums[i] = 0; //set to some base case or zero
}
}
}
您将无法删除&#34;最后一个值,但必须将其设置为某个基本情况。如果你想真正删除我。你应该使用另一种数据结构,即ArrayList