Remover Items Repetidos ArrayList

Galera estou com um problema preciso remover items repetidos de um arraylist, mas não necessariamente todos, apenas remover quando o item ocorrer mais de 2 vezes.

Sendo que o item a ser removido tem que ser o(s) que está(ão) entre o item inicial e o final.

Por Exemplo.


1 - 100 - 01/02/17/// Item Inicial
1 - 100 - 01/02/17 //////Remover este
1 - 100 - 01/02/17 ///////Remover este
1 - 100 - 01/02/17 ///// Item Final
2 - 100 - 01/02/17
1 - 100 - 01/02/17
1 - 100 - 01/02/17

Com o código Funcional.


1 - 100 - 01/02/17 //Item Inicial
1 - 100 - 01/02/17 //Item Final
2 - 100 - 01/02/17
1 - 100 - 01/02/17 // Item Inicial
1 - 100 - 01/02/17 // item Final

É possível optar por outro tipo de collection? Se sim, então, opte por Set e sua implementação padrão, o HashSet.
Caso contrário, você pode invocar o método hasItem da interface List e verificar se o tal item existe, antes de inserí-lo.

A questão é que eu quero inseri-los de forma repetida para depois reorganizar o arraylist e eliminar as ocorrências repetidas conforme citei.

Se não estiver utilizando java 8, precisa iterar sobre os itens e compará-los um a um, aplicandoa lógica que deseja.
Se estiver utilizando java 8, consegue fazer um pouco diferente.

tentei com esse código>

i=0;int j=1; int k=2;
do
{

       if((registros.get(i).getLeitor() == registros.get(j).getLeitor())&&(registros.get(i).getTag().equals(registros.get(j).getTag()))&&(registros.get(i).getdata().equals(registros.get(j).getdata()))&&
              (registros.get(i).getLeitor() == registros.get(k).getLeitor())&&(registros.get(i).getTag().equals(registros.get(k).getTag()))&&(registros.get(i).getdata().equals(registros.get(k).getdata())))     
             {
             
                 evento objetos2 = new evento(0,0,"","","","");
                 registros.set(j,objetos2);
             }
           i++;
           j++;
           k++;
             
            }while(i<=registros.size());

pensei em setar os objetos repetidos para exclui-los posteriormente. No if esta dando erro. Tenho q comparar o índice atual com os dois próximos e remover o item do meio.

estou usando netbeans 7

Não sei se já resolveu, mas acho que uma das formas de solucionar isto é guardando num hashmap os repetidos com seus respectivos índices. Isso seria um tipo de “marcador” que marca aqueles que devem ser removidos, que no caso são aqueles índices repetidos não iguais ao primeiro nem ao último do range.

Depois, itera pelo array novamente e remove os índices que se encontram no hashmap. Ao limite, essa complexidade continua sendo linear.

Eu não cheguei a testar, portanto não sei se é uma solução válida, mas vale a pena tentar.

Isso não faz diferença alguma para a resolução de seu problema.

Se os seus objetos inseridos na lista implementam corretamente o método equals, você pode usar o indexOf e lastIndexOf para não ficar criando listas auxiliares:

int primeiro = lista.indexOf(objeto);
while ((ultimo = lista.lastIndexOf(objeto)) > primeiro) {
    lista.remove(ultimo);
}
1 curtida

Se reparamos, ele não quer remover TODOS os repetidos excepto o primeiro e último mas sim todos os repetidos SEQUENCIAIS excepto o primeiro e o último da sequência.

Fiz com inteiros mas podes adaptar para qualquer objecto que implemente o equals:

    List<Integer> valores =
            Arrays.asList(1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 3, 3, 3, 4, 4, 4, 5);
    List<Integer> novaLista = new ArrayList<>();
    Integer ultimo = null;
    boolean repetido = false;
    for (Integer j : valores) {

        if (j.equals(ultimo)) {
            repetido = true;
        } else {

            if (repetido) {
                novaLista.add(ultimo);
            }
            novaLista.add(j);
            repetido = false;

        }
        ultimo = j;
    }

   if (repetido) {
       novaLista.add(ultimo);
   }

Acabei utilizando a sua ideia pmlm de ordenar do maior para o menor, ai acabei nem testando o teu código. obrigadão pela ajuda.