Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2011 Objectos, Fábrica de Software LTDA.
   *
   * Licensed under the Apache License, Version 2.0 (the "License"); you may not
   * use this file except in compliance with the License. You may obtain a copy of
   * the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations under
  * the License.
  */
 package br.com.objectos.way.relational;
 
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Sets.newHashSet;
 
 import java.util.List;
 import java.util.Set;
 
 

Author(s):
marcio.endo@objectos.com.br (Marcio Endo)
 
 @ObjectosStandard("Como e quando utilizar Comparator, Comparable e ListIterator")
 public class OrdenarRegistros<R extends Registro> {
 
   private final List<R> registros;
 
   private final List<R> copia;
 
   private final List<R> removidos = newArrayList();
 
   public OrdenarRegistros(List<R> registros) {
     this. = registros;
     this. = newArrayList(registros);
   }
 
   public List<R> getRemovidos() {
     return ;
   }
 
   public List<R> ordenar() {
     // ordena pela data inicial ASC e pela data de criação DESC
     Collections.sort();
 
     // Remove datas iniciais repetidas. Se duas datas iniciais são iguais,
     // remove a que possui data de criação mais antiga (isto é, mantém a criada
     // mais recentemente).
 
     if (.size() > 1) {
       // Remove registros repetidos. Se dois registros possuem datas iniciais
       // diferente mas propriedades iguais, então mantém apenas
       // aquele com data inicial mais 'antiga'
       removerRepetidos();
 
       // por fim, a data final de cada registro é a data inicial do próximo
       // 'menos' um dia. Exceto para o registro final que possui o valor de
       // Registro.DATA_FINAL
       organizarDataFinal();
     }
 
     if (.size() == 1) {
       // garante que o último registro possua data final DATA_FINAL
       .get(0).marcarComoFinal();
     }
 
     // isto só é necessário porque, em geral, 'registros' será uma coleção
     // Hibernate.DELETE_ORPHAN
     .clear();
     return ;
   }
 
   private void removerDatasRepetidas() {
     Set<LocalDatedatasDistintas = newHashSet();
 
     ListIterator<R> iterator = .listIterator();
     while (iterator.hasNext()) {
       R registro = iterator.next();
       LocalDate dataInicial = registro.getDataInicial();
 
       if (datasDistintas.contains(dataInicial)) {
         .add(registro);
         iterator.remove();
       }
 
       datasDistintas.add(dataInicial);
     }
   }
  private void removerRepetidos() {
    // inverte a lista
    Collections.reverse();
    int total = .size();
    ListIterator<R> iterator = .listIterator();
    while (iterator.hasNext()) {
      R registro = iterator.next();
      int proximoIndice = iterator.nextIndex();
      if (proximoIndice == total) {
        continue;
      }
      R proximo = .get(proximoIndice);
      if (proximo.equals(registro)) {
        .add(registro);
        iterator.remove();
        total = .size();
      }
    }
    // reordena lista
    Collections.sort();
  }
  private void organizarDataFinal() {
    int total = .size();
    for (int i = 0; i < total - 1; i++) {
      R registro = .get(i);
      registro.colocarAntesDe(.get(i + 1));
    }
  }
New to GrepCode? Check out our FAQ X