只打印数组中不重复的元素?

Posted

技术标签:

【中文标题】只打印数组中不重复的元素?【英文标题】:Print only non repeated elements in an array? 【发布时间】:2017-10-13 21:29:26 【问题描述】:

这是我的代码 sn-p

import java.util.*;
public class UniqueEl

    public static void main(String []p)
    
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter Array size");
        int size=sc.nextInt();
        //boolean ischeck=true;
        int flag=0,cnt=0;
        int []num=new int[size];
        System.out.println("Enter Array Elements");
        for(int i=0;i<size;i++)
        
            num[i]=sc.nextInt();
        
        System.out.println("Display Array Elements");
        for(int i=0;i<size;i++)
        
            System.out.println("Array Elements are :-"+num[i]);
        
        System.out.println("Unique elements from the array ");
        for(int i=0;i<size;i++)
           
            for(int j=0;j<size;j++)
            
                if(i!=j)
                
                    if(num[i]=num[j])
                    
                        flag=1;
                    
                    else
                    
                        flag=0;
                        break;
                    

                
            
            if(flag==1)
            
                cnt++;
            System.out.println(num[i]+" ");

            
        
    

在这个数组代码中,我必须打印非重复的整数值

说数组值为:-[1,1,2,3,1,2,4,5] 答案应该是:-[3,4,5] 那是我必须打印的非重复整数值。谁能帮我解决这个问题

【问题讨论】:

【参考方案1】:

使用EXOR操作。仅当重复计数为 偶数 且只有 1 个唯一编号时才有效。

public class MyClass 
    public static void main (String[] args) 
     

        int arr[] =  1, 2, 5, 4, 6, 8, 9, 2, 1, 4, 5, 8, 9 ; 
        int n = arr.length; 
        int v = 0;
        for(int i = 0 ; i< n ; i++ )
            v = v ^ arr[i]; //XOR Operation
        

        System.out.print(v); 
     

【讨论】:

【参考方案2】:

您可以使用两个 Map 来存储找到/放弃的值,因此只对数组进行一次迭代。

方法:

数组中的每个元素 元素是否已编入索引(已找到)? 如果没有索引它(到 HashMap) 如果是,将其从索引中删除并放在废弃列表中 结果是索引映射的键。

代码:

Set getUniqueValues(int[] numbers) 

  HashMap<Integer,Boolean> numIndex = new HashMap<Integer, Boolean>();
  HashMap<Integer,Boolean> abandoned = new HashMap<Integer, Boolean>();


  for (int i = 0; i < numbers.length; i++) 
      int currentNumber = numbers[i];

      try 
          // check if already abandoned and skip this iteration
          if ( abandoned.get(currentNumber) != null) continue;
       catch(Exception e) 

      

      boolean isInIndex;
      try 
          // check if it is already indexed
          isInIndex = numIndex.get(currentNumber);
       catch(Exception e) 
          // if not, we found it the first time
          isInIndex = false;
      

      if (isInIndex == false)
          //so we put it to the index
          numIndex.put(currentNumber, true);
      else
          // if it appeared, we abandon it
          numIndex.remove(currentNumber);
          abandoned.put(currentNumber, true);
      
  
   return numIndex.keySet(); 

进一步阅读:

地图使用包装类(整数、布尔值),由 Java 自动转换:

HashMap and int as key

函数返回一个集合,可以转换成数组:

Java: how to convert HashMap<String, Object> to array

【讨论】:

【参考方案3】:

如果您想更正当前​​代码,我只能看到 2 个问题: 1. if(num[i]==num[j]),你想做相等性检查,使用==,因为=是赋值运算符,你想比较num[i]和num[j]。 2. 当你发现任何 int 重复时从内部循环中中断,即 flag=1。当 flag=0 时,表示此数字没有重复,您可以继续使用。请参阅下面的更正代码:

for(int i=0;i<size;i++)
       
        for(int j=0;j<size;j++)
        
            if(i!=j)
            
                if(num[i]==num[j])
                
                    flag=1; //it is repeated number
                    break; //break the loop as we already found a repetition of this number
                

            
        
        if(flag==0)
        
            cnt++;
            System.out.println(num[i]+" "); //here is your non-repeated number
        
    

【讨论】:

【参考方案4】:

也许这会有所帮助:

static int[] uniqueElementsFrom(int[] arr) 
    final Map<Integer, Integer> numberOfOccurences = new HashMap<Integer, Integer>();

    for (int i : arr) 
        if (!numberOfOccurences.containsKey(i)) 
            numberOfOccurences.put(i, 1);
         else 
            numberOfOccurences.put(i, numberOfOccurences.get(i) + 1);
        
    

    final Set<Integer> integers = numberOfOccurences.keySet();

    List<Integer> uniques = new LinkedList<Integer>();
    for (int i: integers) 
        if (numberOfOccurences.get(i) == 1) 
            uniques.add(i);
        
    

    final int[] uniqueIntsArray = new int[uniques.size()];
    for (int counter = 0; counter < uniques.size(); counter++) 
        uniqueIntsArray[counter] = uniques.get(counter);
    
    return uniqueIntsArray;

【讨论】:

【参考方案5】:

一种更简单的方法可能是使用 Java 8 的流功能来计算每个元素的出现次数,然后过滤我们的非唯一元素:

List<Integer> uniqueElements =
    Arrays.stream(num)
          .boxed()
          .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
          .entrySet()
          .stream()
          .filter(e -> e.getValue() == 1)
          .map(Map.Entry::getKey)
          .collect(Collectors.toList());

【讨论】:

以上是关于只打印数组中不重复的元素?的主要内容,如果未能解决你的问题,请参考以下文章

在每个 TimeIntervalNotification 中不重复的随机元素

递归 - 与数组结合,Java 中不重复

为啥 HTML 中不允许重复的 ID 值?

js数组方法——找出两数组中不相同的元素的集合

Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖