সদৃশ কী সহ মানচিত্রের প্রয়োগ


116

আমি সদৃশ কী সহ একটি মানচিত্র রাখতে চাই।

আমি জানি যে অনেকগুলি মানচিত্রের প্রয়োগ রয়েছে (গ্রহপীতা আমাকে প্রায় 50 দেখায়), তাই আমি বাজি ধরে থাকি যে অবশ্যই এটি থাকতে পারে। আমি জানি যে এটি আপনার নিজের মানচিত্রে লিখতে সহজ, তবে আমি এর পরিবর্তে কিছু বিদ্যমান সমাধান ব্যবহার করব।

কমন্স-কালেকশন বা গুগল-সংগ্রহে কিছু হতে পারে?


4
কিভাবে এই কাজ করা উচিত? যদি আপনি কোনও কীটির সাথে সম্পর্কিত একটি মান জিজ্ঞাসা করেন এবং মানচিত্রটিতে এই কীটি একাধিকবার উপস্থিত থাকে তবে কোন মানটি ফেরত দেওয়া উচিত?
মেনেমেন্ট

ব্যতিক্রম নিক্ষেপ করতে পারে পেতে, আমি কেবল পুনরাবৃত্তির জন্য এই মানচিত্রের প্রয়োজন।
আইএডাপ্টার

6
আপনার যদি কেবল পুনরুক্তির জন্য এটির প্রয়োজন হয় তবে প্রথম স্থানে আপনার মানচিত্রের দরকার কেন?
জোড়

2
কারণ আমার পুরো প্রোগ্রামটি ইতিমধ্যে মানচিত্রের সাথে কাজ করে এবং এখন আমি আবিষ্কার করেছি যে ডেটাতে নকল কী থাকা সম্ভব have যদি অন্যভাবে মানচিত্র ব্যবহার করা ভুল হয় তবে আমাদের কাছে ম্যাপের কেবল 5 টি বাস্তবায়ন হবে 50+ নয়।
আইএডাপ্টার

উত্তর:


90

আপনি একটি মাল্টিম্যাপের সন্ধান করছেন এবং প্রকৃতপক্ষে কমন্স-সংগ্রহ এবং পেয়ারা উভয়েরই বেশ কয়েকটি বাস্তবায়ন রয়েছে have একাধিক কীগুলির জন্য প্রতি কী অনুসারে মান সংগ্রহের মাধ্যমে মাল্টিম্যাপগুলি মঞ্জুরি দেয়, যেমন আপনি মানচিত্রে একটি একক বস্তু রাখতে পারেন তবে আপনি সংগ্রহটি পুনরুদ্ধার করতে পারেন।

আপনি যদি জাভা 5 ব্যবহার করতে পারেন তবে আমি পেয়ারা পছন্দ করবো Multimapকারণ এটি জেনারিকস-সচেতন।


3
এছাড়াও, এই মাল্টিম্যাপটি অ্যাপাচি যেমন করে সেভাবে মানচিত্র হওয়ার ভান করে না।
কেভিন বোউরিলিয়ন

7
নোট করুন যে গুগল সংগ্রহগুলি পেয়ারা দ্বারা ছাড়িয়ে গেছে, সুতরাং এখানে মাল্টিম্যাপের পেয়ারা সংস্করণটির লিঙ্কটি রয়েছে: কোড. google.google.com/p/guava-libraries/wiki/…
জোশ গ্লোভার

তবে মাল্টিম্যাপ পুরোপুরি সিরিয়ালাইজযোগ্য নয়, এতে ক্ষণস্থায়ী সদস্য রয়েছে যা একটি ডিসিরিয়ালাইজড উদাহরণকে অকেজো হিসাবে উপস্থাপন করে
ডিস্কুল্টেন

@ এসডচুল্টেন ওয়েল, মাল্টিম্যাপ একটি ইন্টারফেস এবং আপনি কোন প্রয়োগায়ন বলতে চান তা নির্দিষ্ট করে দিচ্ছেন না। com.google.common.collect.HashMultimapহয়েছে readObject/ writeObjectপদ্ধতি, যেমন ArrayListMultimap এবং অপরিবর্তনীয় {তালিকা সেট} Multimap না। আমি একটি বেহুদা deserialized উদাহরণ হিসাবে রিপোর্ট করার মতো একটি বাগ বিবেচনা করব।
এনডি।

1
এ্যাপাচি সংগ্রহগুলি 4.0 সমর্থন জেনেরিক্স commons.apache.org/proper/commons-collections/javadocs/...
kervin

35

আমাদের Google সংগ্রহগুলি বাহ্যিক গ্রন্থাগারের উপর নির্ভর করার দরকার নেই। আপনি কেবল নিম্নলিখিত মানচিত্রটি বাস্তবায়ন করতে পারেন:

Map<String, ArrayList<String>> hashMap = new HashMap<String, ArrayList>();

public static void main(String... arg) {
   // Add data with duplicate keys
   addValues("A", "a1");
   addValues("A", "a2");
   addValues("B", "b");
   // View data.
   Iterator it = hashMap.keySet().iterator();
   ArrayList tempList = null;

   while (it.hasNext()) {
      String key = it.next().toString();             
      tempList = hashMap.get(key);
      if (tempList != null) {
         for (String value: tempList) {
            System.out.println("Key : "+key+ " , Value : "+value);
         }
      }
   }
}

private void addValues(String key, String value) {
   ArrayList tempList = null;
   if (hashMap.containsKey(key)) {
      tempList = hashMap.get(key);
      if(tempList == null)
         tempList = new ArrayList();
      tempList.add(value);  
   } else {
      tempList = new ArrayList();
      tempList.add(value);               
   }
   hashMap.put(key,tempList);
}

দয়া করে কোডটি টিউন করার বিষয়টি নিশ্চিত করুন।


14
অবশ্যই আপনাকে পেয়ারার মাল্টিম্যাপের উপর নির্ভর করার দরকার নেই। এটা ঠিক আপনার জীবন বাড়িয়ে তোলার সাথে সাথে, পুনরায় বাস্তবায়ন করতে পরীক্ষা তাদের, ইত্যাদি হবে না
PhiLho

এটি সমস্ত জোড়ের উপর বিজোড় পুনরাবৃত্তির অনুমতি দেয় না। অবশ্যই আরও ত্রুটি আছে। আমি আমার সমাধানটি সম্পর্কে পরামর্শ দিতে যাচ্ছি যার জন্য আরও একটি অতিরিক্ত শ্রেণি প্রয়োজন, তারপরে @ মননেথের উত্তরটি ঠিক সেটাই দেখেছি।
মার্ক জেরোনিমাস

2
বুনিয়াদি কোড লেখা সর্বদা চতুর নয়। গুগলের আরও ভাল পরীক্ষা হওয়ার সম্ভাবনা বেশি রয়েছে
26-28

26
Multimap<Integer, String> multimap = ArrayListMultimap.create();

multimap.put(1, "A");
multimap.put(1, "B");
multimap.put(1, "C");
multimap.put(1, "A");

multimap.put(2, "A");
multimap.put(2, "B");
multimap.put(2, "C");

multimap.put(3, "A");

System.out.println(multimap.get(1));
System.out.println(multimap.get(2));       
System.out.println(multimap.get(3));

আউটপুট হল:

[A,B,C,A]
[A,B,C]
[A]

দ্রষ্টব্য: আমাদের লাইব্রেরি ফাইলগুলি আমদানি করতে হবে।

http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

বা https://commons.apache.org/proper/commons-colલેક્શન / ডাউনলোডলোড_কলেকশন

import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.map.MultiValueMap;

2
ভাল পরামর্শ, যেহেতু আমি আমার প্রকল্পে স্প্রিং ব্যবহার করছি আমি ডক্স http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/ এ
ম্যাপ এইচটিএমএল

18

আপনি কেবলমাত্র নিয়মিত হ্যাশম্যাপে মানটির জন্য মানগুলির একটি অ্যারে পাস করতে পারেন, এইভাবে সদৃশ কীগুলি অনুকরণ করে এবং কোন ডেটা ব্যবহার করবেন তা সিদ্ধান্ত নিতে হবে।

আপনি কেবল একটি মাল্টিম্যাপ ব্যবহার করতে পারেন , যদিও আমি নিজেই সদৃশ কীগুলির ধারণা পছন্দ করি না।


ধন্যবাদ! TreeMap<String, ArrayList<MyClass>>আমার সদৃশ কী প্রয়োজন সমাধান করে ।
জো

10

যদি আপনি কী-মান-জোড়ার তালিকার বিষয়ে পুনরাবৃত্তি করতে চান (যেমন আপনি মন্তব্যটিতে লিখেছেন), তবে একটি তালিকা বা অ্যারের আরও ভাল হওয়া উচিত। প্রথমে আপনার কী এবং মানগুলি একত্রিত করুন:

public class Pair
{
   public Class1 key;
   public Class2 value;

   public Pair(Class1 key, Class2 value)
   {
      this.key = key;
      this.value = value;
   }

}

আপনি কী এবং মানগুলির জন্য যে ধরণের ব্যবহার করতে চান তার সাথে Class1 এবং Class2 প্রতিস্থাপন করুন।

এখন আপনি এগুলিকে একটি অ্যারে বা একটি তালিকায় রাখতে পারেন এবং এগুলি পুনরাবৃত্তি করতে পারেন:

Pair[] pairs = new Pair[10];
...
for (Pair pair : pairs)
{
   ...
}

আমি কীভাবে অ্যাড () যুক্ত করব () বা রাখব ()। আমি মাত্রা সংখ্যক কঠিন করতে চান না।
অমিত কুমার গুপ্ত

2
এই ক্ষেত্রে একটি তালিকা ব্যবহার করুন। দ্বিতীয় নমুনা তালিকায় <পেয়ার> জোড়া = নতুন তালিকা <পেয়ার> () পরিবর্তন হয়; লুপটি একই থাকে। এই কমান্ডের সাহায্যে আপনি একটি জুড়ি যুক্ত করতে পারেন: જોડીઓ.add (জোড়া);
মেনেমেন্ট

এটি সম্ভবত সৎ হওয়ার সেরা উত্তর।
পলবিজিডি

6

এই সমস্যাটি মানচিত্রের প্রবেশের একটি তালিকা দিয়ে সমাধান করা যেতে পারে List<Map.Entry<K,V>>। আমাদের বাহ্যিক গ্রন্থাগার বা মানচিত্রের নতুন প্রয়োগকরণের দরকার নেই। একটি মানচিত্র এন্ট্রি এইভাবে তৈরি করা যেতে পারে: Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);


5
commons.apache.org

MultiValueMap class

সেই শ্রেণিকে অবমূল্যায়ন করা হয়েছিল। একে এখন মাল্টিভ্যালুম্যাপ বলা হয়। commons.apache.org/proper/commons-collections/javadocs/…
জোতসচি

সংগ্রহসমূহ 4.0 জেনেরিক্সকে কমন্স.এপাচি.আর.গ্রাফিক্স
কমার্স

3

আমার ভুলগুলি থেকে শিখুন ... দয়া করে এটি নিজে থেকে বাস্তবায়ন করবেন না। পেয়ারা মাল্টিম্যাপ যাবার উপায়।

মাল্টিম্যাপে প্রয়োজনীয় একটি সাধারণ বর্ধন হ'ল সদৃশ কী-মান জোড়াকে বারণ করা।

আপনার প্রয়োগে এটি প্রয়োগ / পরিবর্তন করা বিরক্তিকর হতে পারে।

পেয়ারাতে এটি এতটা সহজ:

HashMultimap<String, Integer> no_dupe_key_plus_val = HashMultimap.create();

ArrayListMultimap<String, Integer> allow_dupe_key_plus_val = ArrayListMultimap.create();

2

আমার এই ইস্যুটির কিছুটা আলাদা বৈকল্পিক ছিল: এটি একই কী এর সাথে দুটি পৃথক মানকে সংযুক্ত করা প্রয়োজন। অন্যদের সহায়তা করার ক্ষেত্রে এটি এখানে পোস্ট করা, আমি একটি হ্যাশম্যাপকে মান হিসাবে পরিচয় করিয়ে দিয়েছি:

/* @param frameTypeHash: Key -> Integer (frameID), Value -> HashMap (innerMap)
   @param innerMap: Key -> String (extIP), Value -> String
   If the key exists, retrieve the stored HashMap innerMap 
   and put the constructed key, value pair
*/
  if (frameTypeHash.containsKey(frameID)){
            //Key exists, add the key/value to innerHashMap
            HashMap innerMap = (HashMap)frameTypeHash.get(frameID);
            innerMap.put(extIP, connName+":"+frameType+":"+interfaceName);

        } else {
            HashMap<String, String> innerMap = new HashMap<String, String>();
            innerMap.put(extIP, connName+":"+frameType+":"+interfaceName);
            // This means the key doesn't exists, adding it for the first time
            frameTypeHash.put(frameID, innerMap );
        }
}

উপরের কোডটিতে প্রতিটি ফ্রেমের ইনপুট ফাইলের প্রথম স্ট্রিং থেকে কী ফ্রেমআইডিটি পড়ে নেওয়া হয়, ফ্রেম টাইপহ্যাশটির মান বাকী রেখাটি বিভক্ত করে নির্মিত হয় এবং স্ট্রিং অবজেক্ট হিসাবে মূলত সংরক্ষণ করা হয়েছিল, সময়ের সাথে সাথে ফাইলটির একাধিক লাইন থাকা শুরু হয়েছিল ( একই ফ্রেমআইডি কী-এর সাথে সম্পর্কিত) বিভিন্ন মান সহ) সুতরাং ফ্রেমটাইপহ্যাশকে মান হিসাবে শেষ লাইনের সাথে ওভাররাইট করা হয়েছিল। আমি স্ট্রিং অবজেক্টটিকে অন্য হাশম্যাপ অবজেক্টের সাথে মান ক্ষেত্র হিসাবে প্রতিস্থাপন করেছি, এটি বিভিন্ন মান ম্যাপিংয়ের একক কী বজায় রাখতে সহায়তা করেছে।


2

কোনও অভিনব লিবসের প্রয়োজন নেই। মানচিত্রগুলি একটি অনন্য কী দ্বারা সংজ্ঞায়িত করা হয়েছে, সুতরাং এগুলি বক্র করবেন না, একটি তালিকা ব্যবহার করুন। স্ট্রিম শক্তিশালী are

import java.util.AbstractMap.SimpleImmutableEntry;

List<SimpleImmutableEntry<String, String>> nameToLocationMap = Arrays.asList(
    new SimpleImmutableEntry<>("A", "A1"),
    new SimpleImmutableEntry<>("A", "A2"),
    new SimpleImmutableEntry<>("B", "B1"),
    new SimpleImmutableEntry<>("B", "B1"),
);

এবং এটাই. ব্যবহারের উদাহরণ:

List<String> allBsLocations = nameToLocationMap.stream()
        .filter(x -> x.getKey().equals("B"))
        .map(x -> x.getValue())
        .collect(Collectors.toList());

nameToLocationMap.stream().forEach(x -> 
do stuff with: x.getKey()...x.getValue()...

1
class  DuplicateMap<K, V> 
{
    enum MapType
    {
        Hash,LinkedHash
    }

    int HashCode = 0;
    Map<Key<K>,V> map = null;

    DuplicateMap()
    {
        map = new HashMap<Key<K>,V>();
    }

    DuplicateMap( MapType maptype )
    {
        if ( maptype == MapType.Hash ) {
            map = new HashMap<Key<K>,V>();
        }
        else if ( maptype == MapType.LinkedHash ) {
            map = new LinkedHashMap<Key<K>,V>();
        }
        else
            map = new HashMap<Key<K>,V>();
    }

    V put( K key, V value  )
    {

        return map.put( new Key<K>( key , HashCode++ ), value );
    }

    void putAll( Map<K, V> map1 )
    {
        Map<Key<K>,V> map2 = new LinkedHashMap<Key<K>,V>();

        for ( Entry<K, V> entry : map1.entrySet() ) {
            map2.put( new Key<K>( entry.getKey() , HashCode++ ), entry.getValue());
        }
        map.putAll(map2);
    }

    Set<Entry<K, V>> entrySet()
    {
        Set<Entry<K, V>> entry = new LinkedHashSet<Map.Entry<K,V>>();
        for ( final Entry<Key<K>, V> entry1 : map.entrySet() ) {
            entry.add( new Entry<K, V>(){
                private K Key = entry1.getKey().Key();
                private V Value = entry1.getValue();

                @Override
                public K getKey() {
                    return Key;
                }

                @Override
                public V getValue() {
                    return Value;
                }

                @Override
                public V setValue(V value) {
                    return null;
                }});
        }

        return entry;
    }

    @Override
    public String toString() {
        StringBuilder builder = new  StringBuilder();
        builder.append("{");
        boolean FirstIteration = true;
        for ( Entry<K, V> entry : entrySet() ) {
            builder.append( ( (FirstIteration)? "" : "," ) + ((entry.getKey()==null) ? null :entry.getKey().toString() ) + "=" + ((entry.getValue()==null) ? null :entry.getValue().toString() )  );
            FirstIteration = false;
        }
        builder.append("}");
        return builder.toString();
    }

    class Key<K1>
    {
        K1 Key;
        int HashCode;

        public Key(K1 key, int hashCode) {
            super();
            Key = key;
            HashCode = hashCode;
        }

        public K1 Key() {
            return Key;
        }

        @Override
        public String toString() {
            return  Key.toString() ;
        }

        @Override
        public int hashCode() {

            return HashCode;
        }
    }

আপনাকে ধন্যবাদ @ ড্যাসপিলার আমি এখনই আপনার সম্পাদনাটি দেখছি। আমার স্নিপেটটি সম্পাদনা করা হয়েছে এমন কাউকে দেখার জন্য ভাল লাগল।
গ্যাব্রিয়েল ডেভিড

1
 1, Map<String, List<String>> map = new HashMap<>();

এই ভার্জোজ সলিউশনটিতে একাধিক ত্রুটি রয়েছে এবং এটি ত্রুটিযুক্ত। এটি সূচিত করে যে আমাদের প্রতিটি মানের জন্য একটি সংগ্রহ ইনস্ট্যান্ট করতে হবে, কোনও মান যুক্ত করার বা অপসারণের আগে এর উপস্থিতি পরীক্ষা করে নেওয়া, কোনও মান না রেখে ম্যানুয়ালি মুছতে হবে, ইত্যাদি et

2, org.apache.commons.collections4.MultiMap interface
3, com.google.common.collect.Multimap interface 

জাভা মানচিত্রে-সদৃশ-চাবি


1

এরকম মাল্টিম্যাপ ইমপ্লের কী হবে?

public class MultiMap<K, V> extends HashMap<K, Set<V>> {
  private static final long serialVersionUID = 1L;
  private Map<K, Set<V>> innerMap = new HashMap<>();

  public Set<V> put(K key, V value) {
    Set<V> valuesOld = this.innerMap.get(key);
    HashSet<V> valuesNewTotal = new HashSet<>();
    if (valuesOld != null) {
      valuesNewTotal.addAll(valuesOld);
    }
    valuesNewTotal.add(value);
    this.innerMap.put(key, valuesNewTotal);
    return valuesOld;
  }

  public void putAll(K key, Set<V> values) {
    for (V value : values) {
      put(key, value);
    }
  }

  @Override
  public Set<V> put(K key, Set<V> value) {
    Set<V> valuesOld = this.innerMap.get(key);
    putAll(key, value);
    return valuesOld;
  }

  @Override
  public void putAll(Map<? extends K, ? extends Set<V>> mapOfValues) {
    for (Map.Entry<? extends K, ? extends Set<V>> valueEntry : mapOfValues.entrySet()) {
      K key = valueEntry.getKey();
      Set<V> value = valueEntry.getValue();
      putAll(key, value);
    }
  }

  @Override
  public Set<V> putIfAbsent(K key, Set<V> value) {
    Set<V> valueOld = this.innerMap.get(key);
    if (valueOld == null) {
      putAll(key, value);
    }
    return valueOld;
  }

  @Override
  public Set<V> get(Object key) {
    return this.innerMap.get(key);
  }

  @Override
  etc. etc. override all public methods size(), clear() .....

}

0

আপনি যে প্রসঙ্গে ডুপ্লিকেট কী সহ মানচিত্রটি প্রয়োগের চেষ্টা করছেন তাও ব্যাখ্যা করতে পারেন? আমি নিশ্চিত যে এর চেয়ে ভাল সমাধান আর হতে পারে। মানচিত্র সঙ্গত কারণে অনন্য কী রাখার উদ্দেশ্যে করা হয়। যদিও আপনি যদি সত্যিই এটি করতে চেয়েছিলেন; আপনি ক্লাসটি সর্বদা প্রসারিত করতে পারেন একটি সাধারণ কাস্টম মানচিত্রের ক্লাস লিখতে যার একটি সংঘর্ষ প্রশমিতকরণ ফাংশন রয়েছে এবং আপনাকে একই কীগুলির সাথে একাধিক এন্ট্রি রাখতে সক্ষম করবে।

দ্রষ্টব্য: আপনার অবশ্যই সংঘর্ষ প্রশমন ফাংশনটি প্রয়োগ করতে হবে যে, সংঘর্ষের কীগুলি অনন্য সেট "সর্বদা" রূপান্তরিত হয়। কিছু সহজ, আইটেম হ্যাশকোড বা কিছু দিয়ে কী সংযোজন?


1
প্রসঙ্গটি হ'ল আমি ভেবেছিলাম যে কীগুলি অনন্য হবে, তবে দেখা যাচ্ছে যে এটি সম্ভবত না। আমি সব কিছু রিফ্যাক্টর করতে চাই না কারণ এটি প্রায়শই ব্যবহৃত হবে না।
আইএডাপ্টার

আমি একটি ছোট এক্সএমএল ফাইলটি ডেটাটাইপের মতো হ্যাশম্যাপে রূপান্তর করতে চাই। কেবল সমস্যাটি এক্সএমএল ফাইলের কাঠামো স্থির নয়
অমিত কুমার গুপ্ত

0

কেবলমাত্র সম্পূর্ণ হওয়ার জন্য, অ্যাপাচি কমন্স সংগ্রহগুলির একটি মাল্টিম্যাপ রয়েছে । খারাপ দিকটি হ'ল অ্যাপাচি কমন্স জেনারিক্স ব্যবহার করে না।


1
নোট করুন যে তাদের মাল্টিম্যাপ মানচিত্র প্রয়োগ করে তবে মানচিত্র পদ্ধতির চুক্তিগুলি ভঙ্গ করে। এটা আমাকে বাগ।
কেভিন বোউরিলিয়ন

0

কিছুটা হ্যাক দিয়ে আপনি হুশসেটটি সদৃশ কী সহ ব্যবহার করতে পারেন। সতর্কতা: এটি ভারীভাবে হ্যাশসেট বাস্তবায়ন নির্ভর।

class MultiKeyPair {
    Object key;
    Object value;

    public MultiKeyPair(Object key, Object value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public int hashCode() {
        return key.hashCode();
    }
}

class MultiKeyList extends MultiKeyPair {
    ArrayList<MultiKeyPair> list = new ArrayList<MultiKeyPair>();

    public MultiKeyList(Object key) {
        super(key, null);
    }

    @Override
    public boolean equals(Object obj) {
        list.add((MultiKeyPair) obj);
        return false;
    }
}

public static void main(String[] args) {
    HashSet<MultiKeyPair> set = new HashSet<MultiKeyPair>();
    set.add(new MultiKeyPair("A","a1"));
    set.add(new MultiKeyPair("A","a2"));
    set.add(new MultiKeyPair("B","b1"));
    set.add(new MultiKeyPair("A","a3"));

    MultiKeyList o = new MultiKeyList("A");
    set.contains(o);

    for (MultiKeyPair pair : o.list) {
        System.out.println(pair.value);
    }
}

0

যদি সেখানে সদৃশ কী থাকে তবে একটি কী একাধিক মানের সাথে মিল থাকতে পারে। সুস্পষ্ট সমাধান হ'ল এই মানগুলির তালিকার চাবিটি ম্যাপ করা।

পাইথনে উদাহরণস্বরূপ:

map = dict()
map["driver"] = list()
map["driver"].append("john")
map["driver"].append("mike")
print map["driver"]          # It shows john and mike
print map["driver"][0]       # It shows john
print map["driver"][1]       # It shows mike

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.