it-swarm.dev

إنشاء قائمة مجموعة من القيم الفريدة

لدي ، في Java ، قائمة صفيف بها تلك القيم (العديد من الأسطر ، هذا مجرد مقتطف)

20/03/2013 23:31:46 6870 6810 6800 6720 6860 6670 6700 6650 6750 6830 34864 34272 20/03/2013 23:31:46 6910 6780 6800 6720 6860 6680 6620 6690 6760 6790 35072 34496

حيث أول قيمتين عبارة عن سلاسل تحتوي على بيانات ويتم تخزينها في عنصر واحد.

ما أريد القيام به هو مقارنة عناصر بيانات السلسلة وحذفها على سبيل المثال العنصر الثاني وجميع العناصر المشار إليها في هذا السطر.

في الوقت الحالي ، لقد استخدمت دورة ما حيث يقارن كل عنصر من العناصر 13 السلسلة (من أجل مقارنة سلاسل البيانات فقط)

سؤالي: هل يمكنني تنفيذ حلول أفضل أخرى؟

هذا هو الكود الخاص بي:

import Java.util.Scanner;
import Java.util.List;
import Java.util.ArrayList;
import Java.io.*;
import Java.text.SimpleDateFormat;
import Java.util.Date;

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

    //The input file
    Scanner s = new Scanner(new File("prova.txt"));


    //Saving each element of the input file in an arraylist 
    ArrayList<String> list = new ArrayList<String>();
    while (s.hasNext()){
        list.add(s.next());
    }
    s.close();

    //Arraylist to save modified values
    ArrayList<String> ds = new ArrayList<String>();

    //
    int i;
    for(i=0; i<=list.size()-13; i=i+14){

            //combining the first to values to obtain data  
            String str = list.get(i)+" "+list.get(i+1);
            ds.add(str);
            //add all the other values to arraylist ds
            int j;
            for(j=2; j<14; j++){
                ds.add(list.get(i+j));
            }

            //comparing data values
            int k;  
            for(k=0; k<=ds.size()-12; k=k+13){
                ds.get(k); //first data string element  
                //Comparing with other strings and delete
                //TODO  
            }
    }
    }
}
31
alessandrob

إنشاء قائمة مجموعة من القيم الفريدة

يمكنك استخدام Set.toArray() method.

مجموعة لا تحتوي على عناصر مكررة. بشكل أكثر رسمية ، لا تحتوي المجموعات على زوج من العناصر e1 و e2 ، مثل e1.equals (e2) ، وفي معظمه عنصر فارغ. كما يوحي اسمها ، هذه الواجهة نماذج التجريد مجموعة رياضية.

http://docs.Oracle.com/javase/6/docs/api/Java/util/Set.html

39
Dmitry Zagorulkin

حاول التحقق من التكرارات باستخدام طريقة .contains() في ArrayList ، قبل إضافة عنصر جديد.

سيبدو شيء هكذا

   if(!list.contains(data))
       list.add(data);

ينبغي أن منع التكرارات في القائمة ، وكذلك لا الفوضى ترتيب العناصر ، مثل يبدو أن الناس يبحثون عن.

58
Anudeep Bulla
HashSet hs = new HashSet();
                hs.addAll(arrayList);
                arrayList.clear();
                arrayList.addAll(hs);
15
Amol Suryawanshi
 //Saving each element of the input file in an arraylist 
    ArrayList<String> list = new ArrayList<String>();
    while (s.hasNext()){
        list.add(s.next());
    }

//That's all you need
list = (ArrayList) list.stream().distinct().collect(Collectors.toList());
3
Sadequer Rahman

يمكنك استخدام مجموعة. إنها مجموعة لا تقبل التكرارات.

3
Sorin

استخدم Set

      ...
      Set<String> list = new HashSet<>();
      while (s.hasNext()){
         list.add(s.next());
      }
      ...
3
Mohammad Changani

تأخرت كثيرًا عن الحفلة ، لكن إليكم سنتان:

استخدم LinkedHashSet

أفترض أن ما تحتاجه هو مجموعة التي:

  • لا يسمح لك بإدراج التكرارات ؛
  • يحتفظ ترتيب الإدراج.

LinkedHashSet يقوم بهذا. الميزة في استخدام ArrayList هي أن LinkedHashSet له تعقيد O (1) لـ contains ، مقابل ArrayList ، التي لديها O (n) .


بالطبع ، تحتاج إلى تطبيق أساليب الكائن equals و hashCode بشكل صحيح.

2
MC Emperor

يمكنك القيام بذلك بسهولة باستخدام Hashmap. من الواضح أن لديك مفتاحًا (وهو بيانات السلسلة) وبعض القيم.

حلقة على جميع الخطوط الخاصة بك وإضافتها إلى الخريطة الخاصة بك.

Map<String, List<Integer>> map = new HashMap<>();
...
while (s.hasNext()){
  String stringData = ...
  List<Integer> values = ...
  map.put(stringData,values);
}

لاحظ أنه في هذه الحالة ، سوف تبقي الأخير حدوث خطوط مكررة. إذا كنت تفضل الاحتفاظ بـ أولاً الحدوث وإزالة الآخرين ، فيمكنك إضافة فحص مع Map.containsKey(String stringData); قبل وضع الخريطة.

2
Arnaud Denoyelle

مجرد تجاوز الأسلوب المنطقي يساوي () للكائن المخصص. قل أن لديك ArrayList مع حقل مخصص f1 ، f2 ، ... تجاوز

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof CustomObject)) return false;

    CustomObject object = (CustomObject) o;

    if (!f1.equals(object.dob)) return false;
    if (!f2.equals(object.fullName)) return false;
    ...
    return true;
}

وتحقق من استخدام أسلوب (ArrayList) الذي يحتوي على طريقة (). هذا هو.

1
shuvomiah

يمكنك القراءة من ملف إلى خريطة ، حيث يكون المفتاح هو التاريخ وتخطي إذا كان الصف بأكمله إذا كان التاريخ موجودًا بالفعل في الخريطة

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

        int i = 0;
        String lastData = null;
        while (s.hasNext()) {
            String str = s.next();
            if (i % 13 == 0) {
                if (map.containsKey(str)) {
                    //skip the whole row
                    lastData = null;
                } else {
                    lastData = str;
                    map.put(lastData, new ArrayList<String>());
                }
            } else if (lastData != null) {
                map.get(lastData).add(str);
            }


            i++;
        }
0
Natalia

إذا كنت بحاجة إلى قيم فريدة ، فيجب استخدام تطبيق SET الواجهة

0
Sashi Kant

أنا استخدم فئة المساعد. لست متأكدا انها جيدة أو سيئة

public class ListHelper<T> {
    private final T[] t;

    public ListHelper(T[] t) {
        this.t = t;
    }

    public List<T> unique(List<T> list) {
       Set<T> set = new HashSet<>(list);
        return Arrays.asList(set.toArray(t));
    }
}

الاستخدام والاختبار:

import static org.assertj.core.api.Assertions.assertThat;


public class ListHelperTest {

    @Test
    public void unique() {
        List<String> s = Arrays.asList("abc", "cde", "dfg", "abc");
        List<String> unique = new ListHelper<>(new String[0]).unique(s);
        assertThat(unique).hasSize(3);
    }
}

أو إصدار Java8:

public class ListHelper<T> {
    public Function<List<T>, List<T>> unique() {
        return l -> l.stream().distinct().collect(Collectors.toList());
    }
}

public class ListHelperTest {
    @Test
    public void unique() {
        List<String> s = Arrays.asList("abc", "cde", "dfg", "abc");
        assertThat(new ListHelper<String>().unique().apply(s)).hasSize(3);
    }
}
0
lapkritinis