จุดตัดและการรวมกันของ ArrayLists ใน Java


130

มีวิธีการใดบ้างที่จะทำได้? ฉันกำลังมองหา แต่ไม่พบเลย

อีกคำถาม: ฉันต้องการวิธีการเหล่านี้เพื่อที่ฉันจะได้กรองไฟล์ บางANDตัวเป็นตัวกรองและบางORตัวเป็นตัวกรอง (เช่นในทฤษฎีเซต) ดังนั้นฉันต้องกรองตามไฟล์ทั้งหมดและรวม / ตัดกัน ArrayLists ที่เก็บไฟล์เหล่านั้น

ฉันควรใช้โครงสร้างข้อมูลอื่นเพื่อเก็บไฟล์หรือไม่ มีอะไรอีกไหมที่จะให้รันไทม์ที่ดีกว่านี้?


1
หากคุณไม่ต้องการสร้างรายการใหม่ Vector.retainAll (Vector) จะตัดเวกเตอร์ต้นฉบับของคุณให้เหลือเฉพาะจุดตัดกับเวกเตอร์ที่สอง
user2808054

@ user2808054 ทำไมVector? คลาสนั้นหมดกำลังใจตั้งแต่ Java 1.2
dimo414

@ dimo414 อินเทอร์เฟซที่ฉันใช้ (ฉันไม่มีตัวเลือก) ส่งคืนสิ่งต่างๆเป็นเวกเตอร์ ไม่รู้เคยท้อ! ขอบคุณข้อมูล .. ท้อใจเพราะใคร? ฉันไม่เห็นบันทึกใด ๆ เกี่ยวกับการเลิกใช้งานดังนั้นจึงเป็นเรื่องที่น่าแปลกใจ
user2808054

1
จาก Javadocs: "สำหรับแพลตฟอร์ม Java 2 v1.2 ... ขอแนะนำให้ใช้ ArrayList แทน Vector " เวลาเดียวที่คุณอาจต้องใช้Vectorคือการโต้ตอบข้ามเธรด แต่ยังมีโครงสร้างข้อมูลที่ปลอดภัยกว่าสำหรับกรณีการใช้งานเหล่านั้นด้วย ดูคำถามนี้ด้วย ห้องสมุดใด ๆ ที่ยังคงใช้Vectorในปี 2559 เป็นสิ่งที่น่าสงสัยในความคิดของฉัน
dimo414

@ dimo414 เป็นไลบรารีของไอบีเอ็มฮ่า ๆ ! (API ข้อมูล Lotus Domino) ขอบคุณสำหรับข้อมูลที่เป็นประโยชน์มาก
user2808054

คำตอบ:


122

นี่คือการใช้งานธรรมดาโดยไม่ต้องใช้ไลบรารีของบุคคลที่สาม ประโยชน์หลักกว่าretainAll, removeAllและaddAllเป็นว่าวิธีการเหล่านี้ไม่ได้ปรับเปลี่ยนรายการเดิมเข้ากับวิธีการ

public class Test {

    public static void main(String... args) throws Exception {

        List<String> list1 = new ArrayList<String>(Arrays.asList("A", "B", "C"));
        List<String> list2 = new ArrayList<String>(Arrays.asList("B", "C", "D", "E", "F"));

        System.out.println(new Test().intersection(list1, list2));
        System.out.println(new Test().union(list1, list2));
    }

    public <T> List<T> union(List<T> list1, List<T> list2) {
        Set<T> set = new HashSet<T>();

        set.addAll(list1);
        set.addAll(list2);

        return new ArrayList<T>(set);
    }

    public <T> List<T> intersection(List<T> list1, List<T> list2) {
        List<T> list = new ArrayList<T>();

        for (T t : list1) {
            if(list2.contains(t)) {
                list.add(t);
            }
        }

        return list;
    }
}

16
คุณสามารถสร้างรายการใหม่ด้วยองค์ประกอบ list1 จากนั้นเรียกใช้ RetainAll, addAll วิธีการ
lukastymo

ทำไมคุณถึงใช้เข้มงวด fp ในโซลูชันนี้
lukastymo

9
ควรใช้ a HashSetเพื่อintersectionให้ประสิทธิภาพเคสโดยเฉลี่ยเป็น O (n) แทน O (n ^ 2)
ซง

1
โพสต์นี้สามารถใช้การอัปเดตเพื่อแสดงให้เห็นถึงประโยชน์ของ Java 8 Stream API
SME_Dev

ฉันได้รับข้อผิดพลาดเมื่อฉันพยายามกำหนดค่านี้ -> ตัวอย่าง: ArrayList <String> total total = (ArrayList <String>) จุดตัด (list2, list1) ---> ไม่สามารถส่ง java.util.arraylist ไปยัง java.util.arraylist < string>
ส่งมอบ

123

คอลเลกชัน (ดังนั้น ArrayList ยัง) มี:

col.retainAll(otherCol) // for intersection
col.addAll(otherCol) // for union

ใช้การใช้งานรายการหากคุณยอมรับการทำซ้ำการใช้งานชุดหากคุณไม่:

Collection<String> col1 = new ArrayList<String>(); // {a, b, c}
// Collection<String> col1 = new TreeSet<String>();
col1.add("a");
col1.add("b");
col1.add("c");

Collection<String> col2 = new ArrayList<String>(); // {b, c, d, e}
// Collection<String> col2 = new TreeSet<String>();
col2.add("b");
col2.add("c");
col2.add("d");
col2.add("e");

col1.addAll(col2);
System.out.println(col1); 
//output for ArrayList: [a, b, c, b, c, d, e]
//output for TreeSet: [a, b, c, d, e]

3
มีการแก้ไขปัญหาที่ยูเนี่ยนนี้"ไม่ถูกต้องเพราะมันจะมีองค์ประกอบทั่วไปครั้งที่สอง" การแก้ไขแนะนำให้ใช้ a HashSetแทน
คอส

5
จริงๆแล้วมีการแก้ไขโปรดดู: "ใช้การใช้งานรายการหากคุณยอมรับการใช้งานซ้ำการใช้งานชุดหากคุณไม่ทำ:"
lukastymo

7
ไม่คงทั้งหมดไม่ใช่จุดตัดสำหรับรายการ ข้างต้นองค์ประกอบทั้งหมดใน col ที่ไม่ได้อยู่ใน otherCol จะถูกลบออก สมมติว่า otherCol คือ {a, b, b, c} และ col คือ {b, b, b, c, d} จากนั้น col จะลงท้ายด้วย {b, b, b, c} ซึ่งไม่ใช่จุดตัดของทั้งสองอย่างเคร่งครัด ฉันคาดหวังว่าจะเป็น {b, b, c} กำลังดำเนินการอื่น
demongolem

1
ฉันยังไม่เห็นว่าaddAll()สหภาพสำหรับรายการเป็นอย่างไร เป็นเพียงการเชื่อมรายการที่สองเข้ากับส่วนท้ายของรายการแรก การดำเนินการรวมจะหลีกเลี่ยงการเพิ่มองค์ประกอบหากรายการแรกมีอยู่แล้ว
dimo414

66

โพสต์นี้ค่อนข้างเก่า แต่อย่างไรก็ตามมันเป็นโพสต์แรกที่โผล่ขึ้นมาใน Google เมื่อค้นหาหัวข้อนั้น

ฉันต้องการให้อัปเดตโดยใช้สตรีม Java 8 โดยทำสิ่งเดียวกัน (โดยทั่วไป) ในบรรทัดเดียว:

List<T> intersect = list1.stream()
    .filter(list2::contains)
    .collect(Collectors.toList());

List<T> union = Stream.concat(list1.stream(), list2.stream())
    .distinct()
    .collect(Collectors.toList());

หากใครมีวิธีแก้ปัญหาที่ดีกว่า / เร็วกว่าแจ้งให้เราทราบ แต่โซลูชันนี้เป็นซับที่ดีที่สามารถรวมไว้ในวิธีการได้อย่างง่ายดายโดยไม่ต้องเพิ่มคลาส / วิธีการช่วยเหลือที่ไม่จำเป็นและยังคงให้ความสามารถในการอ่าน


19
Ooof มันอาจจะเป็นซับเดียวที่ดี แต่ต้องใช้เวลา O (n ^ 2) หนึ่งแปลงของรายการไปSetแล้วใช้ชุดของcontainsวิธีการ ไม่ใช่ว่าทุกอย่างในชีวิตจะต้องทำด้วยสตรีม
dimo414

31
list1.retainAll(list2) - is intersection

ยูเนี่ยนจะได้รับแล้วremoveAlladdAll

ค้นหาเพิ่มเติมในเอกสารของคอลเลกชัน (ArrayList คือคอลเล็กชัน) http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html


1
ทั้งสองretainAll()และremoveAll()เป็นการดำเนินการ O (n ^ 2) ในรายการ เราทำได้ดีกว่านี้
dimo414

1
ฉันโหวตแล้ว แต่ตอนนี้ฉันมีคำถาม retainAllของผลลัพธ์ {1, 2, 2, 3, 4, 5} มากกว่า {1, 2, 3} ในผลลัพธ์ {1, 2, 2, 3} ไม่ควรให้ {1, 2, 3} เป็นทางแยกใช่หรือไม่
GyuHyeon Choi

21

สหภาพแรงงานและทางแยกที่กำหนดไว้สำหรับชุดเท่านั้นไม่ใช่รายการ ดังที่คุณกล่าวมา.

ตรวจสอบตัวกรองguava library ฝรั่งยังมีทางแยกและสหภาพแรงงานจริง

 static <E> Sets.SetView<E >union(Set<? extends E> set1, Set<? extends E> set2)
 static <E> Sets.SetView<E> intersection(Set<E> set1, Set<?> set2)

12

คุณสามารถใช้CollectionUtilsจากคอมมอน Apache


7
ในกรณีที่มีคนพบว่าคำตอบนี้สั้นเกินไป: 'CollectionUtils.containsAny' และ 'CollectionUtils.containsAll' เป็นวิธีการ
Sebastian

2
มันแปลกที่ CollectionUtils จาก apache commons ไม่รองรับ generics
Vasyl Sarzhynskyi

7

โซลูชันที่ทำเครื่องหมายว่าไม่มีประสิทธิภาพ มีความซับซ้อนของเวลา O (n ^ 2) สิ่งที่เราทำได้คือจัดเรียงทั้งสองรายการและดำเนินการอัลกอริทึมการตัดกันดังรายการด้านล่าง

private  static ArrayList<Integer> interesect(ArrayList<Integer> f, ArrayList<Integer> s) { 
    ArrayList<Integer> res = new ArrayList<Integer>();

    int i = 0, j = 0; 
    while (i != f.size() && j != s.size()) { 

        if (f.get(i) < s.get(j)) {
            i ++;
        } else if (f.get(i) > s.get(j)) { 
            j ++;
        } else { 
            res.add(f.get(i)); 
            i ++;  j ++;
        }
    }


    return res; 
}

อันนี้มีความซับซ้อนของ O (n log n + n) ซึ่งอยู่ใน O (n log n) สหภาพแรงงานทำในลักษณะที่คล้ายคลึงกัน ตรวจสอบให้แน่ใจว่าคุณได้ทำการแก้ไขที่เหมาะสมกับคำสั่ง if-elseif-else

คุณยังสามารถใช้ตัววนซ้ำได้หากต้องการ (ฉันรู้ว่ามันมีประสิทธิภาพมากกว่าใน C ++ ฉันไม่รู้ว่ามันเป็นจริงใน Java หรือไม่)


1
ไม่ทั่วไปเพียงพอ T อาจเทียบเคียงไม่ได้และในบางกรณีการเปรียบเทียบมีราคาแพง ...
Boris Churzin

ไม่ใช่ทั่วไปฉันเห็นด้วยอย่างยิ่ง เปรียบเทียบราคาแพง? คุณจะแก้ปัญหานั้นอย่างไร
AJed

น่าเศร้า - การทำใน O (n ^ 2) จะถูกกว่า :) สำหรับ Numbers วิธีนี้ดี ...
Boris Churzin

น่าเศร้า - คุณไม่ได้ตอบคำถามของฉัน ขอฉันเรียบเรียงใหม่ O (n ^ 2) ดีกว่าอย่างไรเมื่อเทียบกับค่าใช้จ่าย c (n)
AJed

1
การแปลงหนึ่งอินพุตเป็นชุดและการโทรcontains()แบบวนซ้ำ (เนื่องจาก Devenv เป็นคำแนะนำ) จะใช้เวลา O (n + m) การเรียงลำดับมีความซับซ้อนโดยไม่จำเป็นและใช้เวลา O (n log n + m log n + n) ได้รับที่ลดลงเป็น O (n log n) เวลา แต่ก็ยังแย่กว่าเวลาเชิงเส้นและซับซ้อนกว่ามาก
dimo414

4

ฉันคิดว่าคุณควรใช้ a Setเพื่อเก็บไฟล์ถ้าคุณต้องการทำจุดตัดและรวมเข้าด้วยกัน แล้วคุณสามารถใช้ฝรั่ง 's ชุดชั้นจะทำอย่างไรunion, intersectionและกรองด้วยPredicateเช่นกัน ความแตกต่างระหว่างวิธีการเหล่านี้กับคำแนะนำอื่น ๆ คือวิธีการทั้งหมดนี้ทำให้เกิดมุมมองที่ขี้เกียจของสหภาพแรงงานทางแยก ฯลฯ ของทั้งสองชุด Apache Commons สร้างคอลเล็กชันใหม่และคัดลอกข้อมูลไป retainAllเปลี่ยนคอลเล็กชันของคุณโดยการลบองค์ประกอบออกจากคอลเล็กชัน


4

นี่คือวิธีที่คุณสามารถตัดกับสตรีมได้ (อย่าลืมว่าคุณต้องใช้ java 8 สำหรับสตรีม):

List<foo> fooList1 = new ArrayList<>(Arrays.asList(new foo(), new foo()));
List<foo> fooList2 = new ArrayList<>(Arrays.asList(new foo(), new foo()));
fooList1.stream().filter(f -> fooList2.contains(f)).collect(Collectors.toList());

ตัวอย่างรายการที่มีประเภทต่างๆ หากคุณมีขอบเขตระหว่าง foo และ bar และคุณจะได้รับ bar-object จาก foo เกินกว่าที่คุณจะแก้ไขสตรีมได้:

List<foo> fooList = new ArrayList<>(Arrays.asList(new foo(), new foo()));
List<bar> barList = new ArrayList<>(Arrays.asList(new bar(), new bar()));

fooList.stream().filter(f -> barList.contains(f.getBar()).collect(Collectors.toList());

3
  • RetainAll จะแก้ไขรายการของคุณ
  • Guava ไม่มี API สำหรับรายการ (เฉพาะชุด)

ฉันพบว่า ListUtils มีประโยชน์มากสำหรับกรณีการใช้งานนี้

ใช้ ListUtils จาก org.apache.commons.collections หากคุณไม่ต้องการแก้ไขรายการที่มีอยู่

ListUtils.intersection(list1, list2)


3

คุณสามารถใช้ commons-collections4 CollectionUtils

Collection<Integer> collection1 = Arrays.asList(1, 2, 4, 5, 7, 8);
Collection<Integer> collection2 = Arrays.asList(2, 3, 4, 6, 8);

Collection<Integer> intersection = CollectionUtils.intersection(collection1, collection2);
System.out.println(intersection); // [2, 4, 8]

Collection<Integer> union = CollectionUtils.union(collection1, collection2);
System.out.println(union); // [1, 2, 3, 4, 5, 6, 7, 8]

Collection<Integer> subtract = CollectionUtils.subtract(collection1, collection2);
System.out.println(subtract); // [1, 5, 7]

2

ใน Java 8 ฉันใช้วิธีการช่วยเหลือง่ายๆดังนี้:

public static <T> Collection<T> getIntersection(Collection<T> coll1, Collection<T> coll2){
    return Stream.concat(coll1.stream(), coll2.stream())
            .filter(coll1::contains)
            .filter(coll2::contains)
            .collect(Collectors.toSet());
}

public static <T> Collection<T> getMinus(Collection<T> coll1, Collection<T> coll2){
    return coll1.stream().filter(not(coll2::contains)).collect(Collectors.toSet());
}

public static <T> Predicate<T> not(Predicate<T> t) {
    return t.negate();
}

1

หากอ็อบเจ็กต์ในรายการสามารถแฮชได้ (เช่นมีแฮชโค้ดที่เหมาะสมและฟังก์ชันเท่ากับ) วิธีที่เร็วที่สุดระหว่างตารางประมาณ ขนาด> 20 คือการสร้าง HashSet สำหรับสองรายการที่ใหญ่ขึ้น

public static <T> ArrayList<T> intersection(Collection<T> a, Collection<T> b) {
    if (b.size() > a.size()) {
        return intersection(b, a);
    } else {
        if (b.size() > 20 && !(a instanceof HashSet)) {
            a = new HashSet(a);
        }
        ArrayList<T> result = new ArrayList();
        for (T objb : b) {
            if (a.contains(objb)) {
                result.add(objb);
            }
        }
        return result;
    }
}

1

ฉันยังทำงานในสถานการณ์ที่คล้ายกันและขอความช่วยเหลือมาที่นี่ จบลงด้วยการค้นหาโซลูชันของตัวเองสำหรับ Arrays ArrayList AbsentDates = ArrayList ใหม่ (); // จะจัดเก็บ Array1-Array2

หมายเหตุ: การโพสต์สิ่งนี้หากสามารถช่วยให้ผู้อื่นเข้าถึงหน้านี้เพื่อขอความช่วยเหลือได้

ArrayList<String> AbsentDates = new ArrayList<String>();//This Array will store difference
      public void AbsentDays() {
            findDates("April", "2017");//Array one with dates in Month April 2017
            findPresentDays();//Array two carrying some dates which are subset of Dates in Month April 2017

            for (int i = 0; i < Dates.size(); i++) {

                for (int j = 0; j < PresentDates.size(); j++) {

                    if (Dates.get(i).equals(PresentDates.get(j))) {

                        Dates.remove(i);
                    }               

                }              
                AbsentDates = Dates;   
            }
            System.out.println(AbsentDates );
        }

1

จุดตัดของสองรายการของวัตถุที่แตกต่างกันตามคีย์ทั่วไป - Java 8

 private List<User> intersection(List<User> users, List<OtherUser> list) {

        return list.stream()
                .flatMap(OtherUser -> users.stream()
                        .filter(user -> user.getId()
                                .equalsIgnoreCase(OtherUser.getId())))
                .collect(Collectors.toList());
    }

ชุดความแตกต่างระหว่าง 2 รายการนั้นเป็นอย่างไร?
ยีนส์

1
public static <T> Set<T> intersectCollections(Collection<T> col1, Collection<T> col2) {
    Set<T> set1, set2;
    if (col1 instanceof Set) {
        set1 = (Set) col1;
    } else {
        set1 = new HashSet<>(col1);
    }

    if (col2 instanceof Set) {
        set2 = (Set) col2;
    } else {
        set2 = new HashSet<>(col2);
    }

    Set<T> intersection = new HashSet<>(Math.min(set1.size(), set2.size()));

    for (T t : set1) {
        if (set2.contains(t)) {
            intersection.add(t);
        }
    }

    return intersection;
}

JDK8 + (น่าจะเป็นประสิทธิภาพที่ดีที่สุด)

public static <T> Set<T> intersectCollections(Collection<T> col1, Collection<T> col2) {
    boolean isCol1Larger = col1.size() > col2.size();
    Set<T> largerSet;
    Collection<T> smallerCol;

    if (isCol1Larger) {
        if (col1 instanceof Set) {
            largerSet = (Set<T>) col1;
        } else {
            largerSet = new HashSet<>(col1);
        }
        smallerCol = col2;
    } else {
        if (col2 instanceof Set) {
            largerSet = (Set<T>) col2;
        } else {
            largerSet = new HashSet<>(col2);
        }
        smallerCol = col1;
    }

    return smallerCol.stream()
            .filter(largerSet::contains)
            .collect(Collectors.toSet());
}

หากคุณไม่สนใจเกี่ยวกับประสิทธิภาพและต้องการโค้ดขนาดเล็กเพียงแค่ใช้:

col1.stream().filter(col2::contains).collect(Collectors.toList());

0

ทางออกสุดท้าย:

//all sorted items from both
public <T> List<T> getListReunion(List<T> list1, List<T> list2) {
    Set<T> set = new HashSet<T>();
    set.addAll(list1);
    set.addAll(list2);
    return new ArrayList<T>(set);
}

//common items from both
public <T> List<T> getListIntersection(List<T> list1, List<T> list2) {
    list1.retainAll(list2);
    return list1;
}

//common items from list1 not present in list2
public <T> List<T> getListDifference(List<T> list1, List<T> list2) {
    list1.removeAll(list2);
    return list1;
}

0

อันดับแรกฉันกำลังคัดลอกค่าทั้งหมดของอาร์เรย์ลงในอาร์เรย์เดียวจากนั้นฉันกำลังลบค่าที่ซ้ำกันลงในอาร์เรย์ บรรทัดที่ 12 อธิบายว่าตัวเลขเดียวกันเกิดขึ้นเกินเวลาหรือไม่ให้ใส่ค่าขยะพิเศษลงในตำแหน่ง "j" ในตอนท้ายให้สำรวจจากจุดเริ่มต้นและจุดสิ้นสุดและตรวจสอบว่ามีค่าขยะเท่ากันหรือไม่จากนั้นทิ้ง

public class Union {
public static void main(String[] args){

    int arr1[]={1,3,3,2,4,2,3,3,5,2,1,99};
    int arr2[]={1,3,2,1,3,2,4,6,3,4};
    int arr3[]=new int[arr1.length+arr2.length];

    for(int i=0;i<arr1.length;i++)
        arr3[i]=arr1[i];

    for(int i=0;i<arr2.length;i++)
        arr3[arr1.length+i]=arr2[i];
    System.out.println(Arrays.toString(arr3));

    for(int i=0;i<arr3.length;i++)
    {
        for(int j=i+1;j<arr3.length;j++)
        {
            if(arr3[i]==arr3[j])
                arr3[j]=99999999;          //line  12
        }
    }
    for(int i=0;i<arr3.length;i++)
    {
        if(arr3[i]!=99999999)
            System.out.print(arr3[i]+" ");
    }
}   
}

1
ยินดีต้อนรับสู่ Stack Overflow! โปรดทราบว่าคำถามเกี่ยวกับ ArrayList นอกจากนี้ฉันกลัวว่าการใช้งานนี้จะทำให้สิ่งต่างๆเป็นที่ต้องการ ค่า 99999999 ซึ่งใช้เป็นแมวมองอาจเกิดขึ้นในอินพุต มันจะดีกว่าถ้าใช้โครงสร้างแบบไดนามิกเช่นArrayListเพื่อเก็บผลลัพธ์ของการรวมกัน
SL Barth - คืนสถานะ Monica

1
โปรดอธิบายรหัสที่คุณนำเสนอแทนที่จะเป็นเพียงคำตอบของรหัส
tmarois

ฉันแค่ให้เบาะแสว่าคุณต้องใส่มูลค่าขยะ
Ashutosh

ฉันดีใจที่เห็นคุณเพิ่มคำอธิบาย น่าเสียดายที่คำตอบตัวเองยังแย่อยู่ ไม่มีเหตุผลที่จะใช้อาร์เรย์ คุณควรใช้โครงสร้างแบบไดนามิกเช่น ArrayList ถ้า (ด้วยเหตุผลบางอย่าง) คุณต้องใช้อาร์เรย์คุณควรพิจารณาใช้อาร์เรย์ของมากกว่าInteger intจากนั้นคุณสามารถใช้nullแทน "มูลค่าขยะ" ของคุณได้ "ค่าขยะ" หรือ "ค่าที่เฝ้าระวัง" มักเป็นความคิดที่ไม่ดีเนื่องจากค่าเหล่านี้อาจยังคงเกิดขึ้นในอินพุต
SL Barth - คืนสถานะ Monica

0

หลังจากการทดสอบนี่คือแนวทางการตัดกันที่ดีที่สุดของฉัน

ความเร็วที่เร็วขึ้นเมื่อเทียบกับ HashSet Approach HashSet และ HashMap ด้านล่างมีประสิทธิภาพใกล้เคียงกันสำหรับอาร์เรย์ที่มีข้อมูลมากกว่า 1 ล้านรายการ

สำหรับแนวทาง Java 8 Stream ความเร็วค่อนข้างช้าสำหรับอาร์เรย์ที่มีขนาดใหญ่กว่า 10k

หวังว่านี่จะช่วยได้

public static List<String> hashMapIntersection(List<String> target, List<String> support) {
    List<String> r = new ArrayList<String>();
    Map<String, Integer> map = new HashMap<String, Integer>();
    for (String s : support) {
        map.put(s, 0);
    }
    for (String s : target) {
        if (map.containsKey(s)) {
            r.add(s);
        }
    }
    return r;
}
public static List<String> hashSetIntersection(List<String> a, List<String> b) {
    Long start = System.currentTimeMillis();

    List<String> r = new ArrayList<String>();
    Set<String> set = new HashSet<String>(b);

    for (String s : a) {
        if (set.contains(s)) {
            r.add(s);
        }
    }
    print("intersection:" + r.size() + "-" + String.valueOf(System.currentTimeMillis() - start));
    return r;
}

public static void union(List<String> a, List<String> b) {
    Long start = System.currentTimeMillis();
    Set<String> r= new HashSet<String>(a);
    r.addAll(b);
    print("union:" + r.size() + "-" + String.valueOf(System.currentTimeMillis() - start));
}

0

วิธีการใช้งาน RetainAll () สำหรับการค้นหาองค์ประกอบทั่วไป ..ie รายการจุดตัด 1.retainAll (list2)



-1

หากหมายเลขตรงกันกว่าที่ฉันกำลังตรวจสอบมันเกิดขึ้นในครั้งแรกหรือไม่ด้วยความช่วยเหลือของ "indexOf ()" หากหมายเลขตรงกับครั้งแรกให้พิมพ์และบันทึกลงในสตริงดังนั้นเมื่อหมายเลขเดียวกันในครั้งถัดไปตรงกันก็จะชนะ ' t พิมพ์เนื่องจากเงื่อนไข "indexOf ()" จะเป็นเท็จ

class Intersection
{
public static void main(String[] args)
 {
  String s="";
    int[] array1 = {1, 2, 5, 5, 8, 9, 7,2,3512451,4,4,5 ,10};
    int[] array2 = {1, 0, 6, 15, 6, 5,4, 1,7, 0,5,4,5,2,3,8,5,3512451};


       for (int i = 0; i < array1.length; i++)
       {
           for (int j = 0; j < array2.length; j++)
           {
               char c=(char)(array1[i]);
               if(array1[i] == (array2[j])&&s.indexOf(c)==-1)
               {    
                System.out.println("Common element is : "+(array1[i]));
                s+=c;
                }
           }
       }    
}

}


2
อย่าเพิ่งโพสต์รหัสเป็นคำตอบให้คำอธิบายเล็กน้อยว่าคุณกำลังทำอะไรอยู่
Brandon Zamudio

เป็นโปรแกรมแรกของฉันที่ฉันอัปโหลด
Ashutosh

2
แม้ว่ารหัสนี้อาจช่วยในการแก้ปัญหาก็ไม่ได้อธิบายว่าทำไมและ / หรือวิธีการที่มันสามารถตอบคำถามได้ การให้บริบทเพิ่มเติมนี้จะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมาก โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อ จำกัด และสมมติฐานที่ใช้
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.