Простые массивы имеют фиксированное количество ссылок на объекты с фиксированной позицией. Поэтому вы не можете удалять объекты, вы можете только заменить их другими или нулевыми, что оставит целые в середине массива. И это, возможно, не то, что вам нужно.
Поскольку вы не можете удалить элементы из массива, вам необходимо заменить весь массив новым, который содержит только нужные записи. Но возникает новая проблема: при запуске вы должны указать размер целевого массива, но вы не знаете, какой размер вам в конечном итоге понадобится. Поэтому вам нужно либо увеличить размер массива и сохранить реальную используемую длину в другой переменной, используя 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 содержит реальный используемый размер массива.