Удалить дубликаты из строки [] - PullRequest
0 голосов
/ 15 февраля 2020

Я создал webscraper, чтобы тянуть ссылки, время от времени я получаю двойные записи, я храню их в массиве строк [], я бросил пару циклов вместе, чтобы проверить на наличие ошибок но не удалось удалить дубликаты.

    public static void checkForDupes(String[] links) {

    for (int i = 0; i<links.length; i++) {
        String check = links[i];

        for (String link : links) {

            if (check.equals(link)) {
                // remove link
            } 
        }       
    }

}

1 Ответ

0 голосов
/ 15 февраля 2020

Простые массивы имеют фиксированное количество ссылок на объекты с фиксированной позицией. Поэтому вы не можете удалять объекты, вы можете только заменить их другими или нулевыми, что оставит целые в середине массива. И это, возможно, не то, что вам нужно.

Поскольку вы не можете удалить элементы из массива, вам необходимо заменить весь массив новым, который содержит только нужные записи. Но возникает новая проблема: при запуске вы должны указать размер целевого массива, но вы не знаете, какой размер вам в конечном итоге понадобится. Поэтому вам нужно либо увеличить размер массива и сохранить реальную используемую длину в другой переменной, используя LinkedList, который поддерживает переменный размер и хорошую производительность при добавлении элементов.

Кроме того, такие вложенные циклы имеют тенденцию становиться очень медленно, когда они большие. Когда у вас более 20 записей, сбор значений в HashSet происходит намного быстрее, чем в таких простых циклах for, а также устраняет дубликаты уже как побочный эффект.

Очень похожим классом является HashMap который не устранит дубликаты. Вы должны погуглить для объяснения, как работают алгоритмы хеширования и карты sh. Это очень интересный топи c.

Пример:

import java.util.Arrays;
import java.util.HashSet;

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

        String[] links = {"a","b","a","c","b","c","d","e","f"};

        HashSet<String> set=new HashSet<>();
        set.addAll(Arrays.asList(links));

        System.out.println(set);
    }
}

Выходы:

[a, b, c, d, e, f]

Чтобы прочитать отдельный элемент из набора, вы можете use set.get(index).

В следующем примере показано, как добиться того же без HashSet:

import java.util.Arrays;
import java.util.HashSet;

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

        String[] input = {"a", "b", "a", "c", "b", "c", "d", "e", "f"};

        String[] output = new String[input.length];
        int count = 0;

        // Iterate over the input array
        for (String in : input)
        {
            // Check if the string is already in the output array
            boolean found=false;
            for (String out : output)
            {
                if (in.equals(out))
                {
                    found=true;
                    break; // break the inner for loop, no need to continue the search
                }
            }

            if (!found)
            {
                output[count++]=in;
            }
        }

        System.out.println(Arrays.toString(output));
    }
}

Выходы:

[a, b, c, d, e, f, null, null, null]

Обратите внимание, как я упростил циклы for , Также обратите внимание, что выходной массив содержит несколько неиспользуемых пробелов. Переменная counter содержит реальный используемый размер массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...