জাভা দুটি তালিকার তুলনা করুন


92

আমার দুটি তালিকা রয়েছে (জাভা তালিকা নয়, আপনি দুটি কলাম বলতে পারেন)

উদাহরণ স্বরূপ

**List 1**            **Lists 2**
  milan                 hafil
  dingo                 iga
  iga                   dingo
  elpha                 binga
  hafil                 mike
  meat                  dingo
  milan
  elpha
  meat
  iga                   
  neeta.peeta    

আমি এমন একটি পদ্ধতি চাই যা কতগুলি উপাদান একইরূপে ফিরে আসে। এই উদাহরণের জন্য এটি 3 হওয়া উচিত এবং এটি উভয় তালিকার অনুরূপ মান এবং বিভিন্ন মানকেও ফিরিয়ে আনতে হবে।

আমি হ্যাশম্যাপ ব্যবহার করা উচিত যদি হ্যাঁ তবে আমার ফলাফলটি পাওয়ার কী পদ্ধতি?

সাহায্য করুন

পিএস: এটি কোনও স্কুল অ্যাসাইনমেন্ট নয় :) সুতরাং আপনি যদি আমাকে কেবল গাইড করেন তবে যথেষ্ট হবে


দয়া করে প্রস্তাব করুন যে কোনও ডেটা স্ট্রাকচার তালিকাটি জাভা তালিকা বা
হ্যাশম্যাপ

4
ব্যতিক্রমী ক্ষেত্রে আপনার কী করা উচিত তা ভেবে নিশ্চিত হন। তালিকাগুলি কি একই মান দুটি করে রাখতে পারে? যদি তাই হয়, যদি "ডিঙ্গো" দুটি তালিকায় দু'বার থাকে, তবে এটি দুটি উপাদানকে সাধারণ বা কেবল একটিতে গণনা করে?
জাভাদোকএমডি

আপনি কি তালিকার একটি পরিবর্তন করতে পারেন?
অ্যান্টনি ফোরলনি

কীভাবে সম্পাদনা করবেন ?? হ্যাঁ প্রতিটি তালিকায় একাধিকবার একই জাতীয় মান থাকতে পারে
ব্যবহারকারী 238383

ট্যাগগুলির নীচে প্রশ্নের ঠিক পরে একটি ছোট লিঙ্কের সম্পাদনা হওয়া উচিত ।
অস্কারলাইজ

উত্তর:


160

সম্পাদনা

এখানে দুটি সংস্করণ দেওয়া আছে। এক ব্যবহারArrayList এবং অন্য ব্যবহারHashSet

তাদের তুলনা করুন এবং আপনার তৈরি করুন থেকে নিজের সংস্করণ , যতক্ষণ না আপনি আপনার প্রয়োজনীয় জিনিস পান get

এটি কভার করার জন্য যথেষ্ট হতে হবে:

পিএস: এটি কোনও স্কুল অ্যাসাইনমেন্ট নয় :) সুতরাং আপনি যদি আমাকে কেবল গাইড করেন তবে যথেষ্ট হবে

আপনার প্রশ্নের অংশ।

আসল উত্তরের সাথে অবিরত:

আপনি একটি ব্যবহার করতে পারেন java.util.Collection এবং / অথবা এর java.util.ArrayListজন্য ।

RetainAll পদ্ধতি নিম্নলিখিত আছে:

এই সংগ্রহে থাকা কেবলমাত্র নির্দিষ্ট উপাদানগুলিতে থাকা উপাদানগুলিকেই ধরে রাখে

এই নমুনা দেখুন:

import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;

public class Repeated {
    public static void main( String  [] args ) {
        Collection listOne = new ArrayList(Arrays.asList("milan","dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"));
        Collection listTwo = new ArrayList(Arrays.asList("hafil", "iga", "binga", "mike", "dingo"));

        listOne.retainAll( listTwo );
        System.out.println( listOne );
    }
}

সম্পাদনা

দ্বিতীয় অংশের জন্য (অনুরূপ মান) আপনি অপসারণ সমস্ত পদ্ধতি ব্যবহার করতে পারেন :

নির্দিষ্ট সংগ্রহের মধ্যে থাকা এই সংগ্রহের সমস্ত উপাদান সরিয়ে দেয়।

এই দ্বিতীয় সংস্করণ আপনাকে একই মান দেয় এবং হ্যান্ডলগুলি পুনরাবৃত্তি করে (সেগুলি ত্যাগ করে)।

এবার এটির পরিবর্তে Collectionএকটি হতে পারে (পার্থক্যটি হ'ল, সেটটি পুনরাবৃত্ত মানের মান দেয় না)SetList

import java.util.Collection;
import java.util.HashSet;
import java.util.Arrays;

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

          Collection<String> listOne = Arrays.asList("milan","iga",
                                                    "dingo","iga",
                                                    "elpha","iga",
                                                    "hafil","iga",
                                                    "meat","iga", 
                                                    "neeta.peeta","iga");

          Collection<String> listTwo = Arrays.asList("hafil",
                                                     "iga",
                                                     "binga", 
                                                     "mike", 
                                                     "dingo","dingo","dingo");

          Collection<String> similar = new HashSet<String>( listOne );
          Collection<String> different = new HashSet<String>();
          different.addAll( listOne );
          different.addAll( listTwo );

          similar.retainAll( listTwo );
          different.removeAll( similar );

          System.out.printf("One:%s%nTwo:%s%nSimilar:%s%nDifferent:%s%n", listOne, listTwo, similar, different);
      }
}

আউটপুট:

$ java Repeated
One:[milan, iga, dingo, iga, elpha, iga, hafil, iga, meat, iga, neeta.peeta, iga]

Two:[hafil, iga, binga, mike, dingo, dingo, dingo]

Similar:[dingo, iga, hafil]

Different:[mike, binga, milan, meat, elpha, neeta.peeta]

এটি যদি আপনার যা প্রয়োজন ঠিক তা না করে তবে এটি আপনাকে একটি ভাল সূচনা দেয় যাতে আপনি এখান থেকে পরিচালনা করতে পারেন।

পাঠকের জন্য প্রশ্ন: আপনি পুনরাবৃত্ত সমস্ত মানকে কীভাবে অন্তর্ভুক্ত করবেন?


@ অস্কার, আমার সঠিক ধারণা, তবে আমরা নিশ্চিত হতে পারি না যে আমরা এর লিখিত সামগ্রীগুলি পরিবর্তন করতে পারতাম listOne, তবে +1 করে যাই!
অ্যান্টনি ফোরলনি

@ পোয়েজেনলব্রিকেন্টস জেনেরিক নয় কাঁচা ধরণের দ্বারা আপনি কী বোঝাতে চান ? কেন না?
অস্কাররাজ

অস্কার, আপনি আমার আপডেট হওয়া প্রশ্নটি দেখেছেন? এটি কি পুনরাবৃত্তি মানকে সমর্থন করে?
ব্যবহারকারীর 238384

@ অস্কার: java.sun.com/docs/books/jls/third_edition/html/… "জাভা প্রোগ্রামিং ভাষায় উদারতা প্রবর্তনের পরে লিখিত কোডে কাঁচা প্রকারের ব্যবহার কঠোরভাবে নিরুৎসাহিত করা হয়েছে। ভবিষ্যতের সংস্করণগুলি সম্ভবত এটি সম্ভব জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজ কাঁচা ধরণের ব্যবহারকে অস্বীকার করবে। "
বহুজেন্দ্রিক্রেন্টস

4
ডুপ্লিকেট এবং কাঁচা ধরণের হ্যান্ডেল করতে @ পোলিজেলব্রিকেন্টস উত্তরগুলি আপডেট হয়েছে। বিটিডাব্লু, জাভা এর ভবিষ্যত সংস্করণ ... কখনও ঘটবে না। ;)
অস্কারলাইজ

37

আপনি চেষ্টা intersection()এবং subtract()পদ্ধতি থেকে করতে পারেন CollectionUtils

intersection() পদ্ধতি আপনাকে সাধারণ উপাদান এবং এর সমন্বয় দেয় subtract() পদ্ধতিটি আপনাকে সমস্ত অস্বাভাবিক দেয়।

তাদের অনুরূপ উপাদানগুলির যত্ন নেওয়া উচিত


6
নোট করা উচিত যে এই সমাধানটির জন্য অ্যাপাচি সিকমনগুলি দরকার
স্যার কোডসালট

9

এগুলি কি সত্যিই তালিকাগুলি (সদৃশযুক্ত, সদৃশযুক্ত ), বা সেগুলি সেট করা হয়েছে (অর্ডারড, কোনও নকল নেই)?

কারণ এটি যদি পরবর্তী হয় তবে আপনি java.util.HashSet<E>সুবিধাজনকটি ব্যবহার করে প্রত্যাশিত লিনিয়ার সময়ে এটি ব্যবহার করতে পারেন, বলতে পারেন এবং এটি করতে পারেন retainAll

    List<String> list1 = Arrays.asList(
        "milan", "milan", "iga", "dingo", "milan"
    );
    List<String> list2 = Arrays.asList(
        "hafil", "milan", "dingo", "meat"
    );

    // intersection as set
    Set<String> intersect = new HashSet<String>(list1);
    intersect.retainAll(list2);
    System.out.println(intersect.size()); // prints "2"
    System.out.println(intersect); // prints "[milan, dingo]"

    // intersection/union as list
    List<String> intersectList = new ArrayList<String>();
    intersectList.addAll(list1);
    intersectList.addAll(list2);
    intersectList.retainAll(intersect);
    System.out.println(intersectList);
    // prints "[milan, milan, dingo, milan, milan, dingo]"

    // original lists are structurally unmodified
    System.out.println(list1); // prints "[milan, milan, iga, dingo, milan]"
    System.out.println(list2); // prints "[hafil, milan, dingo, meat]"

ভাল কোন তথ্য কাঠামো হওয়া উচিত তা আমি সত্যিই জানি না। এটির নকল রয়েছে। এখন আপনি আপডেট হওয়া প্রশ্নটি দেখতে পারবেন
user238384

এটি কি ডেটা সেট থেকে পুনরাবৃত্তি মানগুলি সরিয়ে দেবে? coz আমি কোনও মান হারাতে চাই না :(
ব্যবহারকারীর 238384

@ গাজারবয়: আমি উভয় প্রশ্নের সমাধান করার চেষ্টা করেছি। আরও স্পষ্টতা জিজ্ঞাসা করতে নির্দ্বিধায়।
বহুজেন্দ্রবিক্যান্টস

ধন্যবাদ বহু আমি আপনার প্রোগ্রামটির সদৃশ উদাহরণগুলির সাথে প্রথম তালিকায় প্রথমবারের মতো দু'বার "আইগা" যুক্ত করেছিলাম তবে তবুও এটি আমাকে উত্তর হিসাবে 3 ফেরত দেয়। এটি এখন 4 হওয়া উচিত। coz list 1 এর 4 টির মতো মান রয়েছে। যদি আমি একাধিকবার একটি এন্ট্রি যুক্ত করি তবে এটি কাজ করা উচিত। কি বলো? অন্য যে কোনও ডাটা স্ট্রাকচার?
ব্যবহারকারী 238383

6

জাভা 8 অপসারণ ব্যবহার

public int getSimilarItems(){
    List<String> one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta");
    List<String> two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection
    int initial = two.size();

    two.removeIf(one::contains);
    return initial - two.size();
}

এটি দেখতে দুর্দান্ত দেখাচ্ছে, তবে আমি তালিকাগুলিকে সংশোধিত রাখতে চাইলে আমাকে তালিকাগুলির মধ্যে একটি ক্লোন করতে হবে এবং এটি নির্দিষ্ট ক্ষেত্রে পছন্দসই হবে না।
সেবাস্তিয়ান ডি'গোস্টিনো

6

আপনি যদি দুটি সংগ্রহের সমতা পরীক্ষা করার কোনও সহজ উপায় সন্ধান করেন তবে আপনি ব্যবহার করতে পারেন org.apache.commons.collections.CollectionUtils.isEqualCollection, যাতে অর্ডার নির্বিশেষে দুটি সংগ্রহের তুলনা করা হয়।


4

সমস্ত পদ্ধতির মধ্যে, আমি ব্যবহার org.apache.commons.collections.CollectionUtils#isEqualCollectionকরাই সেরা পন্থা find এখানে কারণগুলি -

  • আমাকে কোনও অতিরিক্ত তালিকা ঘোষণা করতে / নিজেকে সেট করতে হবে না
  • আমি ইনপুট তালিকাগুলি পরিবর্তন করছি না
  • এটা খুব দক্ষ। এটি ও (এন) জটিলতায় সমতা পরীক্ষা করে।

যদি apache.commons.collectionsনির্ভরতা হিসাবে থাকা সম্ভব না হয় তবে আমি তালিকার সাম্যতা পরীক্ষা করার জন্য এটি অনুসরণ করা অ্যালগরিদমটি কার্যকর করার জন্য সুপারিশ করব কারণ তার দক্ষতার কারণে।



1

অনুমান hash1এবংhash2

List< String > sames = whatever
List< String > diffs = whatever

int count = 0;
for( String key : hash1.keySet() )
{
   if( hash2.containsKey( key ) ) 
   {
      sames.add( key );
   }
   else
   {
      diffs.add( key );
   }
}

//sames.size() contains the number of similar elements.

তিনি অনুরূপ কীগুলির তালিকা চান, কতগুলি কী একরকম নয়। আমি মনে করি.
রোসদী কাসিম

আপনার সাহায্যের জন্য ধন্যবাদ স্টিফান হ্যাঁ রোজদি সঠিক এবং আপনিও। আমার একইসাথে মোট অনুরূপ মান এবং অনুরূপ মানগুলির প্রয়োজন।
ব্যবহারকারী 238384

1

আমি তালিকা তুলনা একটি খুব মৌলিক উদাহরণ পাওয়া তালিকা তুলনা আকার যাচাই এই উদাহরণটিতে প্রথম এবং তারপর চেক অন্য এক তালিকার বিশেষ উপাদান প্রাপ্যতা।


-1
public static boolean compareList(List ls1, List ls2){
    return ls1.containsAll(ls2) && ls1.size() == ls2.size() ? true :false;
     }

public static void main(String[] args) {

    ArrayList<String> one = new ArrayList<String>();
    one.add("one");
    one.add("two");
    one.add("six");

    ArrayList<String> two = new ArrayList<String>();
    two.add("one");
    two.add("six");
    two.add("two");

    System.out.println("Output1 :: " + compareList(one, two));

    two.add("ten");

    System.out.println("Output2 :: " + compareList(one, two));
  }

4
যখন দুটিতে "এক" এর 3 কপি থাকে তখন এই সমাধানটি ভুল ফলাফল দেয় returns এটি ভুলভাবে একটি সত্য ফলাফল তৈরি করবে।
জোসেফ ফিটজগারাল্ড

এই অংশটির জন্য ধন্যবাদ: && ls1.size () == ls2.size ()
Nouar

4
? true :falseআপনার স্নিপেটে কোনও কারণ প্রয়োজন বলে মনে করেন ?
ক্রিজিসটফ টমাসজেউস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.