从“完整”数组中删除元素

时间:2016-10-22 19:58:42

标签: java arrays element

这是我正在做的一项小任务。我是一名初学Java程序员,在这个小程序中遇到了一个问题。由于某种原因,如果数组包含10个元素,则删除方法不起作用。我希望得到一些关于解决这个问题的建议/帮助。

当数组包含10个元素,并且我尝试删除一个元素时,textArea中元素的排列不是它应该的。一切都应该移过1,包含9个元素,最后一个元素为0.当一个元素被移除时,所有元素都应该自己调整并向左移动。

输出的默认外观为: [0,0,0,0,0,0,0,0,0,0]

如果输入数字1 - 10,输出应如下所示: [1,2,3,4,5,6,7,8,9,10]

如果用户尝试删除最后一个元素,则会将其设置为0: [1,2,3,4,5,6,7,8,9,0]

但是,如果用户试图删除另一个元素,假设为5,则程序在控制台中抛出一个越界异常。如果他们删除5,则输出应为: [1,2,3,4,6,7,8,9,10,0]

有关更多上下文,以下是分配详细信息:

  

创建一个能够在数组中存储和显示整数值的完整程序。程序应该能够处理的最大值数为10.

     
      
  • 使用屏幕输入(文本框和按钮)向阵列添加其他元素。
  •   
  • 根据屏幕输入(文本框和按钮)删除数组元素。
  •   
  • 列出数组中的所有元素并计算所有元素的总和。
  •   
  • 列出数组中的偶数元素并计算偶数元素的总和。
  •   
  • 列出数组中的奇数元素并计算奇数元素的总和。
  •   
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Arrays;

    public class SumElement implements ActionListener {

    public static JButton add, remove, sumAll, sumEven, sumOdd;
    public static JTextField inputField;
    public static JTextArea textArea;
    public static int counter = 0;
    public static int[] numbers = new int[10];
    public static JLabel titleText;

    public static void main(String[] args) {
        System.out.println("Counter: " + counter);

        // Frame
        JFrame frame = new JFrame("Integer Sums");
        frame.setSize(178, 240);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Container panel
        JPanel container = new JPanel();
        container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
        frame.setContentPane(container);

        // Title panel
        JPanel titlePane = new JPanel();
        titleText = new JLabel("Integer Sums");

        // Content panel
        JPanel content = new JPanel();
        content.setPreferredSize(new Dimension(300, 180));
        content.setLayout(null);

        // Buttons
        add = new JButton("Add");
        add.setBounds(4, 50, 80, 20);
        add.addActionListener(new SumElement());

        remove = new JButton("Remove");
        remove.setBounds(88, 50, 80, 20);
        remove.addActionListener(new SumElement());

        sumAll = new JButton("Sum All");
        sumAll.setBounds(4, 74, 164, 20);
        sumAll.addActionListener(new SumElement());

        sumEven = new JButton("Sum Even");
        sumEven.setBounds(4, 98, 164, 20);
        sumEven.addActionListener(new SumElement());

        sumOdd = new JButton("Sum Odd");
        sumOdd.setBounds(4, 122, 164, 20);
        sumOdd.addActionListener(new SumElement());

        // Text area, and text field
        inputField = new JTextField();
        inputField.setBounds(4, 21, 164, 25);

        JLabel inputLabel = new JLabel("Input integer value below:");
        inputLabel.setBounds(12, 6, 164, 13);

        textArea = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setBounds(4, 144, 165, 36);

        // Adding everything
        container.add(titlePane);
        titlePane.add(titleText);
        container.add(content);
        content.add(inputLabel);
        content.add(inputField);
        content.add(scrollPane);
        content.add(add);
        content.add(remove);
        content.add(sumAll);
        content.add(sumEven);
        content.add(sumOdd);

        // Extras
        frame.toFront();
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("Add")) {
            if (counter == 10) {
                titleText.setText("Error: too many values");
            } else {
                numbers[counter] = Integer.parseInt(inputField.getText());
                textArea.setText(Arrays.toString(numbers));
                counter++;
            }
            System.out.println("Counter: " + counter);
        } else if (event.getActionCommand().equals("Remove")) {
            for (int i = 0; i < counter; i++) {
                if (Integer.parseInt(inputField.getText()) == numbers[i]) {
                    for (int x = i; x < counter - 1; x++) {
                        numbers[x] = numbers[x + 1];
                    }
                    textArea.setText(Arrays.toString(numbers));
                    counter--;
                } else {
                    titleText.setText("Error: value doesn't exist");
                }
            }
            System.out.println("Counter: " + counter);
        } else if (event.getActionCommand().equals("Sum All")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                sum += numbers[i];
            }
            titleText.setText("Sum is " + sum);
        } else if (event.getActionCommand().equals("Sum Even")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                if (numbers[i] % 2 == 0) {
                    sum += numbers[i];
                }
            }
            titleText.setText("Sum of even values is: " + sum);
        } else if (event.getActionCommand().equals("Sum Odd")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                if (numbers[i] % 2 != 0) {
                    sum += numbers[i];
                }
            }
            titleText.setText("Sum of odd values is: " + sum);
        }
    }
}

以下是代码的修改后的actionPerformed部分。现在可以删除最后一个数组值。但是,如果数组已满,并且用户尝试删除除最后一个元素之外的元素,则会引发错误。我仍然不确定如何解决此错误。

    public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("Add")) {
            if (counter == 10) {
                titleText.setText("Error: too many values");
            } else {
                numbers[counter] = Integer.parseInt(inputField.getText());
                textArea.setText(Arrays.toString(numbers));
                counter++;
            }
            System.out.println("Counter: " + counter);
        } else if (event.getActionCommand().equals("Remove")) {
            if (Integer.parseInt(inputField.getText()) == numbers[9]) {
                numbers[9] = 0;
                counter--;
                textArea.setText(Arrays.toString(numbers));
            } else {
                for (int i = 0; i < counter; i++) {
                    if (Integer.parseInt(inputField.getText()) == numbers[i]) {
                        for (int x = i; x <= counter - 1; x++) {
                            numbers[x] = numbers[x + 1];
                        }
                        textArea.setText(Arrays.toString(numbers));
                        counter--;
                    }
                }
            }
            System.out.println("Counter: " + counter);
        } else if (event.getActionCommand().equals("Sum All")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                sum += numbers[i];
            }
            titleText.setText("Sum is " + sum);
        } else if (event.getActionCommand().equals("Sum Even")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                if (numbers[i] % 2 == 0) {
                    sum += numbers[i];
                }
            }
            titleText.setText("Sum of even values is: " + sum);
        } else if (event.getActionCommand().equals("Sum Odd")) {
            int sum = 0;
            for (int i = 0; i <= counter; i++) {
                if (numbers[i] % 2 != 0) {
                    sum += numbers[i];
                }
            }
            titleText.setText("Sum of odd values is: " + sum);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果存在,下面的代码应正确删除整数值。但是,它不处理数组中存在多个相同整数值的情况(即数组有1,1,1,1,1,1,1,0,0,0并尝试删除1)。它不会删除所有1并在文本框中显示全部0。

我不确定要求是否在数组中包含唯一值。如果是这种情况,则应更改添加功能以处理方案。

else if (event.getActionCommand().equals("Remove")) {
            boolean removed = false;
            titleText.setText("Integer Sums");
            for (int i = 0; i < counter; i++) {
                if (Integer.parseInt(inputField.getText()) == numbers[i]) {
                    for (int x = i; x < counter; x++) {
                        if (x == 9) {
                            numbers[x] = 0;
                        } else {
                            numbers[x] = numbers[x + 1];
                            numbers[x + 1] =0;
                        }
                    }
                    textArea.setText(Arrays.toString(numbers));
                    counter--;
                    removed = true;
                }               
            }
            if (!removed) {
                titleText.setText("Error: value doesn't exist");
            } 
            System.out.println("Counter: " + counter);
        } 

答案 1 :(得分:0)

问题应该在于这段代码:

for (int x = i; x <= counter - 1; x++) {
    numbers[x] = numbers[x + 1];
}

然后数组包含10个元素,变量计数器为10。 在这种情况下,迭代将用于计数-1,即9.在下一行中,您尝试获得“数字[x + 1]”,即10 [(x = 9)+1],因此得到一个越界。 如果你将它改为计数器-2而不是-1它应该可以工作,因为你从下一个字段中获取元素来填充它应该仍然有用的地方。