创建一个独特值的Arraylist

在Java中,我有一个带有这些值的arraylist(很多行,这只是一个提取)

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

前两个值是包含数据并存储在单个元素中的字符串。

我想要做的是比较字符串数据元素和删除例如第二个和引用该行的所有元素。

现在,我使用了一个for循环,每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 list = new ArrayList(); while (s.hasNext()){ list.add(s.next()); } s.close(); //Arraylist to save modified values ArrayList ds = new ArrayList(); // 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 } } } } 

创建一个独特值的Arraylist

您可以使用Set.toArray()方法。

不包含重复元素的集合。 更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。 正如其名称所暗示的,此接口模拟数学集抽象。

http://docs.oracle.com/javase/6/docs/api/java/util/Set.html

在添加新元素之前,尝试使用ArrayList上的.contains()方法检查重复项。

它看起来像这样

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

这应该可以防止列表中的重复,以及不像人们似乎寻找的那样搞乱元素的顺序

 HashSet hs = new HashSet(); hs.addAll(arrayList); arrayList.clear(); arrayList.addAll(hs); 

你可以使用一套。 这是一个不接受重复的集合。

使用Set

  ... Set list = new HashSet<>(); while (s.hasNext()){ list.add(s.next()); } ... 
  //Saving each element of the input file in an arraylist ArrayList list = new ArrayList(); while (s.hasNext()){ list.add(s.next()); } //That's all you need list = (ArrayList) list.stream().distinct().collect(Collectors.toList()); 

您可以使用Hashmap轻松完成此Hashmap 。 你显然有一个键(这是字符串数据)和一些值。

循环所有线条并将它们添加到地图中。

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

请注意,在这种情况下,您将保留重复行的最后一次出现。 如果您希望保留第一个出现并删除其他出现,可以使用Map.containsKey(String stringData);添加一个检查Map.containsKey(String stringData); 在放入地图之前。

如果需要唯一值,则应使用SET接口的实现

只需覆盖自定义对象的布尔equals()方法。 假设您有一个带有自定义字段f1,f2,…覆盖的ArrayList

 @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实例的contains()方法进行检查。 而已。

您可以从文件到地图进行读取,其中键是日期,如果日期已经在地图中则跳过整行

  Map> map = new HashMap>(); 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()); } } else if (lastData != null) { map.get(lastData).add(str); } i++; } 

聚会很晚,但这是我的两分钱:

使用LinkedHashSet

我假设你需要的是一个集合:

  • 不允许您插入重复项;
  • 保留插入订单。

LinkedHashSet执行此操作。 使用ArrayList的优点是LinkedHashSet对于contains操作具有O(1)的复杂度,而与具有O(n)的 ArrayList相反。


当然,您需要正确实现对象的equalshashCode方法。