如何在Java中仅更改ArrayList中第一次出现的对象,忽略后续重复项

时间:2017-10-19 19:45:13

标签: java arraylist

我希望得到一个整数数组并检查两个数字,第一个数字是我要替换的数组中的数字,第二个数字是我想要替换第一个数字的数字。我已设法编写代码来破坏性地和建设性地执行此操作,但我想仅将第一次出现的数字更改为第二个数字,而不是所有条目。

例如,如果我要输入{3,5,1,3,6}和3作为我想要替换的数字,而9作为我想要替换它的数字,我应该得到{9,5 ,1,3,6}因为我只想将第一次出现更改为3到9,而不是两者。

import java.util.*;

public class Ex6 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter some numbers. When you're done, type 999");
        boolean cont = true;
        while (cont == true) {
            int x = scanner.nextInt();
            if (x == 999) {
                cont = false;
            } else {
                list.add(x);
            }
        }

        System.out.println("Enter a number to replace");
        Scanner sc = new Scanner(System.in);
        int numberCompare = sc.nextInt();
        System.out.println("Enter the number you want to replace it with");
        Scanner sc2 = new Scanner(System.in);
        int numberReplace = sc2.nextInt();
        changeD(list, numberCompare, numberReplace);
        System.out.println(Arrays.toString(list.toArray()));
        //System.out.println(changeC(list, numberCompare, numberReplace));
    }

    public static ArrayList<Integer> changeD(ArrayList<Integer> list, int numberCompare, int numberReplace) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == numberCompare) {
                list.set(i, numberReplace);
            }
        }
        return list;
    }

        /*I am only using one method at a time, depending on what I wish to 
    test. The above changes 
      destructively and below changes constructively*/

        /*public static ArrayList<Integer> changeC(ArrayList<Integer> list, int 
    numberCompare, int numberReplace) {
            ArrayList<Integer> b = new ArrayList<Integer>();
            for(int i = 0; i<list.size(); i++) {
                int x = list.get(i);
                b.add(x);
            }
            for(int j = 0; j<b.size(); j++) {
                if(b.get(j) == numberCompare) {
                    b.set(j, numberReplace);
                }
            }
            return b;
        }*/
}

我也很好奇main方法中的代码将用户输入添加到ArrayList中。是否有更好的方法,不要求用户输入999以突破while循环。

2 个答案:

答案 0 :(得分:2)

在if:

中添加break语句
if (list.get(i) == numberCompare) {
    list.set(i, numberReplace);
    break;
}

这样,第一次条件为真时,循环就会被中断。

答案 1 :(得分:2)

因此,请勿更改List的下一个值 实际上你会迭代每个元素 您应该在设置值后立即停止。

此外,该方法应该不返回任何内容 您返回作为参数传递的对象。它不是必需的,您也不要在客户端使用它 最后,按界面编程。优先List超过ArrayList声明的类型。

List<Integer> list = new ArrayList<>();
...
public static void changeD(List<Integer> list, int 
numberCompare, int numberReplace) {
    for(int i = 0; i<list.size(); i++) {
        if(list.get(i) == numberCompare) {
            list.set(i, numberReplace);
            return;
        }
    }
}