【问题标题】: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] 那是我必须打印的非重复整数值。谁能帮我解决这个问题

【问题讨论】:

    标签: java arrays


    【解决方案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());
            

            【讨论】:

              猜你喜欢
              • 2013-09-12
              • 2021-05-03
              • 2012-06-09
              • 1970-01-01
              • 1970-01-01
              • 2014-12-08
              • 2012-10-24
              • 2012-05-13
              • 2013-06-21
              相关资源
              最近更新 更多