2012-03-06 4 views
0

Я разбираю файл с более чем 4M строк в нем. Он имеет вид a^b^c^d^...^.... Теперь я хочу, чтобы все уникальные точки (только первые две записи были уникальными) из файла. Итак, что я делаю,Получение уникальных enteries из файла

String str; 
Set<String> lines = new LinkedHashSet<String>(); 
Set<String> set = Collections.synchronizedSet(lines); 
String str1[] = str.split("\\^"); 
set.add(str1[0]+"^"+str1[1]); 

Таким образом, это дает мне уникальные 1 и 2 уникальные точки из файла. Тем не менее, я также хочу, чтобы 3-й пункт (временная метка) i.e str1 [2] был связан с указанными выше пунктами. Новый файл должен иметь форму.

str1[0]^str1[1]^str1[2] 

Как мне это сделать?

+0

Я думаю, вам нужно уточнить; если у вас есть комбинации «1^2^3» и «1^2^4», первые два будут совпадать, но какая временная метка вы хотите? –

+0

Я хотел бы иметь отметку времени, которая наступила сначала i.e 1^2^3. – RFT

+0

Где находится метка времени в 1^2^3? – Kristian

ответ

1

Создайте класс, содержащий информацию, необходимую, которые вы будете хранить в наборе, но только заботиться о первых двух в РАВНО/хэш-код. Тогда вы можете сделать:

Set<Point> set = new HashSet<Point>(); 
String str1[] = str.split("\\^"); 
set.add(new Point(str1[0], str1[1], str1[2])); 

Использование:

public class Point { 

    String str1; 
    String str2; 
    String str3; 

    public Point(String str1, String str2, String str3) { 
     this.str1 = str1; 
     this.str2 = str2; 
     this.str3 = str3; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((str1 == null) ? 0 : str1.hashCode()); 
     result = prime * result + ((str2 == null) ? 0 : str2.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Point other = (Point) obj; 
     if (str1 == null) { 
      if (other.str1 != null) 
       return false; 
     } else if (!str1.equals(other.str1)) 
      return false; 
     if (str2 == null) { 
      if (other.str2 != null) 
       return false; 
     } else if (!str2.equals(other.str2)) 
      return false; 
     return true; 
    } 
} 
+0

Извините за довольно многословные равные и hashCode, у меня было Eclipse генерировать их для меня – Kristian

+0

Это помогло! Благодаря! – RFT

+0

Отлично. Пожалуйста, примите ответ, если это поможет. – Kristian

2

Есть несколько решений, которые приходят на ум.

  1. Сделайте класс для 3 записей. Переопределите метод equals и проверяйте только первые 2 записи, поэтому 2 объекта равны, если первые 2 записи равны. Теперь добавьте все элементы в набор. Итак, что вы получите в своем наборе, это список с уникальными первыми и вторыми точками и первым окном вашей метки времени.

  2. Другое решение состоит в том, чтобы сохранить два списка: один с двумя точками + отметка времени, одна с двумя вашими очками. Вы можете сделать set.contains (...), чтобы проверить, уже ли вы видели точку, и если вы не добавили в список с 2 точками + меткой времени.

+0

Убедитесь, что у вас есть правильная реализация как equals, так и hashCode, см., Например, http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Kristian

+0

@Nactive Я подумал о 2-м решении и нашел это немного неуклюжий и думал, если бы был более умный способ. – RFT

+0

Ofc первая реализация лучше второй. Но второй из них просто проще, и поскольку вы уже используете set.add (str1 [0] + "^" + str1 [1]), чтобы добавить уникальные «точки», я думал, что вам может быть интересен быстрый способ вместо определения новый класс и тому подобное. – Nactive

Смежные вопросы