java - una - valores unicos lista desplegable dinamica en celda con formula matricial
Crear un listado de valores únicos (10)
Tengo, en Java, una lista de arrays con esos valores (muchas líneas, esto es solo un extracto)
20/03/2013 23:31:46 6870 6810 6800 6720 6860 6670 6700 6650 6750 6830 34864 34272 20/03/2013 23:31:46 6910 6780 6800 6720 6860 6680 6620 6690 6760 6790 35072 34496
Donde los dos primeros valores son cadenas que contienen datos y se almacenan en un solo elemento.
Lo que quiero hacer es comparar los elementos de datos de cadena y eliminar, por ejemplo, el segundo y todos los elementos referidos a esa línea.
Por ahora, he usado un ciclo para que cada 13 elementos compara la cadena (para comparar solo cadenas de datos)
Mi pregunta: ¿puedo implementar otras mejores soluciones?
Este es mi código:
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Downsampler {
public static void main(String[] args) throws Exception{
//The input file
Scanner s = new Scanner(new File("prova.txt"));
//Saving each element of the input file in an arraylist
ArrayList<String> list = new ArrayList<String>();
while (s.hasNext()){
list.add(s.next());
}
s.close();
//Arraylist to save modified values
ArrayList<String> ds = new ArrayList<String>();
//
int i;
for(i=0; i<=list.size()-13; i=i+14){
//combining the first to values to obtain data
String str = list.get(i)+" "+list.get(i+1);
ds.add(str);
//add all the other values to arraylist ds
int j;
for(j=2; j<14; j++){
ds.add(list.get(i+j));
}
//comparing data values
int k;
for(k=0; k<=ds.size()-12; k=k+13){
ds.get(k); //first data string element
//Comparing with other strings and delete
//TODO
}
}
}
}
Crear un listado de valores únicos
Podría usar el método Set.toArray()
.
Una colección que no contiene elementos duplicados. Más formalmente, los conjuntos no contienen ningún par de elementos e1 y e2 tales como e1.equals (e2), y como máximo un elemento nulo. Tal como lo implica su nombre, esta interfaz modela la abstracción del conjunto matemático.
Intente buscar duplicados con un método .contains()
en ArrayList, antes de agregar un nuevo elemento.
Se vería algo como esto
if(!list.contains(data))
list.add(data);
Eso debería evitar duplicados en la lista, así como no estropear el orden de los elementos , como las personas parecen buscar.
Podrías usar un Set. Es una colección que no acepta duplicados.
Puede leer de un archivo a un mapa, donde la clave es la fecha y omitir si toda la fila si la fecha ya está en el mapa
Map<String, List<String>> map = new HashMap<String, List<String>>();
int i = 0;
String lastData = null;
while (s.hasNext()) {
String str = s.next();
if (i % 13 == 0) {
if (map.containsKey(str)) {
//skip the whole row
lastData = null;
} else {
lastData = str;
map.put(lastData, new ArrayList<String>());
}
} else if (lastData != null) {
map.get(lastData).add(str);
}
i++;
}
Si necesita valores únicos, debe usar la implementación de la interfaz SET
Simplemente anule el método boolean equals () de objeto personalizado. Supongamos que tiene una ArrayList con campo personalizado f1, f2, ... anulación
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof CustomObject)) return false;
CustomObject object = (CustomObject) o;
if (!f1.equals(object.dob)) return false;
if (!f2.equals(object.fullName)) return false;
...
return true;
}
y verificar usando el método contains () de la instancia ArrayList. Eso es.
Usar Set
...
Set<String> list = new HashSet<>();
while (s.hasNext()){
list.add(s.next());
}
...
Usted puede hacer esto fácilmente con un Hashmap
. Obviamente tiene una clave (que es la cadena de datos) y algunos valores.
Haz un bucle en todas tus líneas y agrégalas a tu mapa.
Map<String, List<Integer>> map = new HashMap<>();
...
while (s.hasNext()){
String stringData = ...
List<Integer> values = ...
map.put(stringData,values);
}
Tenga en cuenta que en este caso, mantendrá la última ocurrencia de líneas duplicadas. Si prefiere mantener la primera ocurrencia y eliminar las otras, puede agregar una Map.containsKey(String stringData);
con Map.containsKey(String stringData);
antes de poner en el mapa.
//Saving each element of the input file in an arraylist
ArrayList<String> list = new ArrayList<String>();
while (s.hasNext()){
list.add(s.next());
}
//That''s all you need
list = (ArrayList) list.stream().distinct().collect(Collectors.toList());
HashSet hs = new HashSet();
hs.addAll(arrayList);
arrayList.clear();
arrayList.addAll(hs);