亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在java中從數組中查找重復元素出現兩次以上

在java中從數組中查找重復元素出現兩次以上

LEATH 2021-06-07 10:42:20
我想從數組中找出重復的元素和索引號。我為此寫了一個代碼。它運行良好,但只有在重復元素的數量超過 2 時才無法生成準確的輸出。我從文件中讀取值,然后構建一個數組,然后從該數組中搜索重復元素。import java.io.File;import java.util.Arrays;import java.util.Scanner;public class T1 {public static void main(String args[]) throws Exception{    Scanner x=new Scanner(new File("C:\\Duplicate_array.txt"));    int [] duplicate_data=new int[9];    int i1=0;    while(x.hasNext()){        int a=x.nextInt();        duplicate_data[i1]=a;        i1++;    }    System.out.println(Arrays.toString(duplicate_data));    for (int i = 0; i < duplicate_data.length-1; i++) {        for (int j = i+1; j < duplicate_data.length; j++) {            if ((duplicate_data[i] == duplicate_data[j]) && (i != j)) {                System.out.println("Duplicate Element : "+duplicate_data[j]);                System.out.println("Index of that duplicate element : "+j);            }        }    }}}這是我的輸出:[5, 6, 1, 6, 9, 5, 2, 1, 5]Duplicate Element : 5Index of that duplicate element : 5Duplicate Element : 5Index of that duplicate element : 8Duplicate Element : 6Index of that duplicate element : 3Duplicate Element : 1Index of that duplicate element : 7Duplicate Element : 5Index of that duplicate element : 8最后一行錯誤。它已經在開始的位置找到 5:8。但在程序結束時它再次搜索 5 并給出位置編號。最后的搜索是不必要的。如何擺脫最后一次搜索?
查看完整描述

3 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

您只想遍歷數組一次。如果你想要的只是重復,你可以簡單地通過跟蹤你在使用之前看到的任何值來做到這一點ArrayList:


int[] data = {5, 6, 1, 6, 9, 5, 2, 1, 5};


System.out.println(Arrays.toString(data));


ArrayList<Integer> seenBeforeList = new ArrayList<>();

for(int index = 0; index < data.length; index++){

    int value = data[index];

    if(seenBeforeList.contains(value)){

        System.out.println("Duplicate Element : " + value);

        System.out.println("Index of that duplicate element : " + index);

    } else {

        seenBeforeList.add(value);

    }

}

輸出:


[5, 6, 1, 6, 9, 5, 2, 1, 5]

Duplicate Element : 6

Index of that duplicate element : 3

Duplicate Element : 5

Index of that duplicate element : 5

Duplicate Element : 1

Index of that duplicate element : 7

Duplicate Element : 5

Index of that duplicate element : 8

如果您想按值分組,那么使用 a 更有意義HashMap,將值存儲為鍵,將索引存儲為值。然后簡單地遍歷HashMap.


查看完整回答
反對 回復 2021-06-10
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

(i != j)在您的 if 語句中沒有必要,因為j總是領先i1,但這不是您的問題。


您可以嘗試使用重復數組標志來了解何時已經找到重復項。


import java.util.Arrays;


public class StackOverflow {

    public static void main(String args[]) throws Exception {

        int[] duplicate_data = {5,6,1,6,9,5,2,1,5};

        boolean[] duplicate = new boolean[duplicate_data.length];


        System.out.println(Arrays.toString(duplicate_data));

        for (int i = 0; i < duplicate_data.length - 1; i++) {

            for (int j = i + 1; j < duplicate_data.length; j++) {

                // Make sure you haven't flagged this as a duplicate already

                if (!duplicate[j] && duplicate_data[i] == duplicate_data[j]) {

                    duplicate[j] = true;

                    System.out.println("Duplicate Element : " + duplicate_data[j]);

                    System.out.println("Index of that duplicate element : " + j);

                }

            }

        }

    }

}

結果:


[5, 6, 1, 6, 9, 5, 2, 1, 5]

Duplicate Element : 5

Index of that duplicate element : 5

Duplicate Element : 5

Index of that duplicate element : 8

Duplicate Element : 6

Index of that duplicate element : 3

Duplicate Element : 1

Index of that duplicate element : 7


查看完整回答
反對 回復 2021-06-10
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

它正在再次搜索相同的重復項,因為您沒有以任何方式存儲以前找到的重復項。因此,您必須使用數據結構來存儲以前找到的重復項,而不是再次搜索它們。這讓我們找到了一個更好的解決方案來查找重復項,它從一開始就使用哈希集,因為它是 O(n) 而不是 O(n^2)


import java.io.File;

import java.util.Arrays;

import java.util.Scanner;


public class T1 {

    public static void main(String args[]) throws Exception {

        Scanner x=new Scanner(new File("C:\\Duplicate_array.txt"));

        Set<Integer> set = new HashSet<Integer>();

        int index = 0;

        while(x.hasNext()){

            int nextNumber = x.nextInt();

            if (set.contains(nextNumber)) {

                System.out.println("Duplicate Element : " + nextNumber);

                System.out.println("Index of that duplicate element : "+index); 

            } else

                set.add(nextNumber);

        }

    }

}

如您所見,使用 時HashSet,我們不需要兩個嵌套for循環。我們可以HashSet在常數時間 O(1) 內測試 a 是否包含一個數字,這消除了逐個元素搜索整個數組以找到重復項的需要。


查看完整回答
反對 回復 2021-06-10
  • 3 回答
  • 0 關注
  • 479 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號