Получение уникальных записей из файла - PullRequest
0 голосов
/ 07 марта 2012

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

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-я точка (временная метка), т.е. str1 [2], была связана с вышеуказанными точками.Новый файл должен иметь форму.

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

Как мне поступить?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

На ум приходит несколько решений.

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

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

1 голос
/ 07 марта 2012

Создайте класс, содержащий необходимую вам информацию, которую вы будете хранить в наборе, но заботитесь только о первых двух в equals / hashCode. Тогда вы можете сделать:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...