只打印数组中不重复的元素?
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面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素
1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖