如果数组中有两个以上的重复项,如何检测和删除? 在下面的例子中,我采用了元素“10,20,30,40,40,40,50,60,70,80,10”的数组。这里40重复三次,重复10次两次。我可以编写一个程序来检测两个重复但我无法将40(重复三次)缩小到一次。 注意: - 我想在不使用任何java集合的情况下执行此操作
public class ArrayDuplicate {
public void run1()
{
int[] a = {10, 20, 30, 40, 40, 40, 50, 60, 70, 80 ,10};
int size=a.length;
System.out.println("Array size before duplicate deletion "+size);
for(int i =0;i<(size-1);i++)
{
for(int j=i+1;j<=(size-1);j++)
{
if(a[i]==a[j] &&i!=j)
{
while(j<(size-1))
{
a[j]=a[j+1];
j++;
}
size--;
}
}
}
System.out.print("The array after deleting the duplicates is ");
for(int k=0;k<=(size-1);k++)
{
System.out.print(a[k]); //40 is being printed twice
if(k<(size-1))
{
System.out.print(",");
}
else
System.out.print(".");
}
}
public static void main(String[] args)
{
ArrayDuplicate ob = new ArrayDuplicate();
ob.run1();
}
}
答案 0 :(得分:3)
你说过你只想为列表中的存在3次或更多的元素保留一个元素(而不是2)。 如果他们是2或更多,TreeSet将是您唯一需要的东西。
你说在出现3次或更多次之后,你只想保持1次。
你在这里:
int[] input = whatever_your_input;
List<Integer> result = new ArrayList<>();
Map<Integer, Integer> valueCounter = new HashMap<>();
for (int i=0; i<input.length; i++) {
int counter = valueCounter.get(input[i]);
if (counter = null) {
counter = 0;
}
valueCounter.put(input[i], counter++);
if (counter <3) {
result.add(input[i]);
}
}
结果将包含输出列表。
编辑:为了清楚起见,如果您不想要任何重复,只需要这样:
int[] input = whatever_your_input;
Set<Integer> result = new TreeSet<>();
for (int i=0; i<input.length; i++) {
result.add(input[i]);
}
结果将包含您的原始列表,没有任何重复,同时保持相同的排序。
编辑2:好吧,看来OP想要的根本没有重复。此外,没有使用Java集合。我们走了:
int[] input = whatever_your_input;
int[] tmpResult = new int[input.length];
int tmpLength = 0;
for (int i=0; i<input.length; i++) {
boolean duplicated = false;
for (int j=0; j<tmpLength; j++) {
if (tmpResult[j] == input[i]) {
duplicated = true;
break;
}
}
if (!duplicated) {
tmpResult[tmpLength] = input[i];
tmpLength++;
}
}
int[] result = new int[tmpLength];
System.arraycopy(tmpResult, 0, result, 0, tmpLength);
结果将包含相同顺序的值和重复的值。
答案 1 :(得分:2)
int[] a = {10, 20, 30, 40, 40, 40, 50, 60, 70, 80 ,10};
Set<Integer> set = new HashSet<Integer>();
for (int i : a) {
set.add(i);
}
a = set.toArray(new int[set.size()]);
希望能帮到你!
答案 2 :(得分:1)
我认为OP不想使用集合来删除重复项。 所以我只修改了他的代码,如下所示。
for (int i = 0; i < (size - 1); i++) {
for (int j = i + 1; j <= (size - 1); j++) {
if (a[i] == a[j] && i != j) {
while (j < (size - 1)) {
a[j] = a[j + 1];
j++;
}
i--;//recheck in inner for loop is performed (i--) , to check adjacent duplicate element.
size--;
}
}
}
这里执行内部for循环的重新检查(i - ),以检查相邻的重复元素。
答案 3 :(得分:1)
希望下面的代码可以。
$(window).load(function () {
$('input').change(function(){
var $this = $(this), $div = $('label.ui-button.ui-widget.ui-state-default[for=' + $this.attr('id') + ']');
if( $this.is(':checked') )
{
$div.addClass('circle-checked');
}
else
{
$div.removeClass('circle-checked');
}
}).change();
});
答案 4 :(得分:1)
我知道为什么40会重复两次。在你的循环中,当i = 3且j = 4时,a [i] = a [j],所以在while循环中,数组向左移动,
a [4] = a [5],a [5] = a [6],a [6] = a [7],a [7] = a [8] ...
然后,
a [] = {10,20,30,40,40,50,60,70,80,10},尺寸= 9,j = 9。
继续for循环,i = 4,j = 5,但是当i = 3时,a [3] = a [4] = 40,所以循环不能缩减40(重复三次)到一次。
我修改了你的代码,如下所示。
public class ArrayDuplicate {
public void run1()
{
int[] a = {10, 20, 30, 40, 40, 40, 50, 40, 60, 70, 80 ,10};
int size=a.length;
System.out.println("Array size before duplicate deletion "+size);
for(int i =0;i<(size-1);i++)
{
for(int j=i+1;j<=(size-1);j++)
{
if(a[i]==a[j] &&i!=j)
{
int temp = j;
while(temp<(size-1))
{
a[temp]=a[temp+1];
temp++;
}
size--;
j=i;
}
}
}
System.out.print("The array after deleting the duplicates is ");
for(int k=0;k<=(size-1);k++)
{
System.out.print(a[k]); //40 is being printed twice
if(k<(size-1))
{
System.out.print(",");
}
else
System.out.print(".");
}
}
public static void main(String[] args)
{
ArrayDuplicate ob = new ArrayDuplicate();
ob.run1();
}
}
答案 5 :(得分:0)
Set
的实现无法保留重复项,因此通过将所有值插入Set
,所有删除操作都将被删除。
使用Java 8 Streams and Collections可以实现如下:
// Remove all duplicates by inserting into a Set
Set<Integer> noDupes = Arrays.stream(a).boxed().collect(Collectors.toCollection(TreeSet::new));
// Set to primitive array
a = noDupes.stream().mapToInt(Integer::intValue).toArray();
然后a
将保留原始值减去重复项。