从数组中删除左侧重复项

问题描述 投票:0回答:4

我正在尝试查找代码中的错误,我想知道您是否可以帮助我。我的任务是编写一个方法,该方法将数组作为输入并返回该数组而不留下重复项(最后一个数字保留)。如果输入为( 1,2,1,2,1,2,3 ),我的代码将不起作用,它返回 (1, 1, 2, 3) 而不是 1,2,3。这是代码

     public static int [] solve(int [] arr){
          boolean check=false;
        ArrayList<Integer> test = new ArrayList<>(); // idk how to compete this task without ArrayList
          for (int i = 0; i < arr.length; i++) { // Here i pass my array to ArrayList
             test.add(arr[i]);
             }
             
            while(check==false) {
                for (int i = 0; i < test.size(); i++) {
                   for (int j = i + 1; j < test.size(); j++) { // Somewhere here must be my mistake that i can't find 
                       check=true;
                       if (test.get(i) == test.get(j)) {
                           test.remove(i);
                          check=false;
                       }
                   }
               }
           }
      // i created second array to return array without duplcates. 
           int arr2[];
             arr2=new int[test.size()];
             for(int i=0;i<arr2.length;i++){
                 arr2[i]=test.get(i);
             }
        
        return arr2;
    
       }
     }

我尝试自己完成这个任务,所以直到现在我才使用Google来获取帮助。如果您知道如何改进我的代码,请随意更改您想要的所有内容。预先感谢您!

java arrays loops arraylist nested-loops
4个回答
4
投票

HashSet可以做到这一点,因为你不能将重复的元素放入HashSet,你需要做的就是将数组放入HashSet

List<Integer> arr2 = new ArrayList<>(new HashSet<>(arr));

2
投票

一个简单的方法是

  1. 以相反的顺序将数组的数字添加到

    LinkedHashSet
    ,以便仅保留唯一数字并保留每个唯一数字的最后一项。

  2. List
    创建一个
    LinkedHashSet

  3. 使用

    List
    反转
    Collections#reverse

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedHashSet;
    import java.util.List;
    import java.util.Set;
    
    public class Main {
        public static void main(String[] args) {
            Set<Integer> set = new LinkedHashSet<>();
            int[] arr = { 7, 7, 4, 5, 7, 2, 7 };
    
            // Add the numbers of the array in reverse order to a LinkedHashSet in order to remove
            // duplicates as well as to preserve the last entry of each unique number.
            for (int i = arr.length - 1; i >= 0; i--) {
                set.add(arr[i]);
            }
    
            // Create a List out of the LinkedHashSet
            List<Integer> list = new ArrayList<>(set);
    
            // Reverse the List
            Collections.reverse(list);
    
            // Display the result
            System.out.println(list);
        }
    }
    

输出:

[4, 5, 2, 7]

2
投票

您可以创建第二个列表,迭代输入列表,并针对输入列表的每个元素检查第二个列表是否包含它。如果没有,请将其添加到第二个列表中。这通过了您在原始帖子中提到的测试用例:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      List<Integer> test = new ArrayList<>();
      List<Integer> noduplicates = new ArrayList<>();
      test.add(1);
      test.add(2);
      test.add(1);
      test.add(2);
      test.add(1);
      test.add(2);
      test.add(3);
      
      for (Integer i : test) {
          if (!noduplicates.contains(i)) {
              noduplicates.add(i);
          }
      }
      System.out.println(noduplicates);
    }
}

0
投票

从 Java 21 开始,

LinkedHashSet
可以与其
addLast(e)
方法一起使用。

public static int[] solve(int[] arr) {
    SequencedSet<Integer> set = new LinkedHashSet<>();
    for (int i : arr) {
        set.addLast(i);
    }
    return set.stream().mapToInt(Integer::intValue).toArray();
}

LinkedHashSet
是一个集合类,它不允许重复(因为是
Set
),同时保留顺序(因为是
SequencedCollection
)。
addLast
方法将给定的项目添加到集合的末尾(如果它尚不存在),或者将其移动到末尾(如果存在)。

© www.soinside.com 2019 - 2024. All rights reserved.