[RESOLVIDO] Ordenar números em formato string e sem repetição numa lista

Estou com um problema de ordenar de forma correta meus ‘números’. vou dar um exemplo de código:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class calcular {

	public static void main(String[] args) {

		List<String> lista = new ArrayList<String>();

		lista.add("10000");
		lista.add("20000");
		lista.add("30000");
		lista.add("40000");
		lista.add("50000");
		lista.add("60000");
		lista.add("70000");
		lista.add("80000");
		lista.add("90000");
		lista.add("100000");
		

		Set ordenado = new TreeSet(lista);
		System.out.println(ordenado);

	}
}

Então, a saída acho que todos já sabem: [10000, 100000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000]
A ajuda que preciso é: Como colocar este 100000 na ultima posição que é onde ele deveria realmente estar de fato? E sim os números não podem ser em int =/

Arrays.sort(suaLista);

Essa solução vai gerar o mesmo resultado que ele já tem.

jkrfabio, a solução é simples. Use o método sort como o kdoigor sugeriu, mas implemente seu próprio comparador.

Converta os números. Um exemplo:

class MeuComparador implements Comparator<String> {
    @Override
    public int compare (String s1, String s2) {
        Long n1 = Long.valueOf (s1);
        Long n2 = Long.valueOf (s2);
        return n1.compareTo (n2);
    }
}
...
Arrays.sort (lista, new MeuComparador());
1 curtida

Isso só funciona com listas em int, a minha está em string cara.

Você vai ter que transformar os numeros em inteiros, ordena-los e depois voltar para String.

Não é possivel ordernar Strings desse jeito pois elas usam a ordem lexicográfica.

[quote=Kazdum]Você vai ter que transformar os numeros em inteiros, ordena-los e depois voltar para String.

Não é possivel ordernar Strings desse jeito pois elas usam a ordem lexicográfica.
[/quote]

[code]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class calcular {

public static void main(String[] args) {

	List<String> lista = new ArrayList<String>();

	lista.add("10000");
	lista.add("20000");
	lista.add("30000");
	lista.add("40000");
	lista.add("50000");
	lista.add("60000");
	lista.add("70000");
	lista.add("80000");
	lista.add("100000");
	lista.add("90000");


	// COnvertendo lista para inteiros

	List<Integer> listaInteiros = new ArrayList<Integer>();

	for (int i = 0; i < lista.size(); i++) {
		listaInteiros.add(Integer.parseInt(lista.get(i)));
	}
	
	//Inteiros ordenados
	
	Set ordenaInteiros = new TreeSet(listaInteiros);
	System.out.println(ordenaInteiros);
	
	//Convertendo lista de inteiros ordenadas corretamente para string
	
	List<String> listaStringsOrdenadas = new ArrayList<String>();
	
	for (int i = 0; i< ordenaInteiros.size(); i++)
	{
		listaStringsOrdenadas.add(ordenaInteiros.toString());
	}
	
	System.out.println(listaStringsOrdenadas);

}

}[/code]

O que eu fiz de errado?

essa minha última saída está me dando uma lista gigante

Leia a minha resposta e a do entanglement. São as que resolvem seu problema de maneira mais fácil.

Aliás, na que ele postou você só precisa copiar o código.

[quote=Rodrigo Sasaki]Leia a minha resposta e a do entanglement. São as que resolvem seu problema de maneira mais fácil.

Aliás, na que ele postou você só precisa copiar o código.[/quote]

Ok, vou implementar

mude isso


for (int i = 0; i&lt; ordenaInteiros.size(); i++)  
        {  
            listaStringsOrdenadas.add(ordenaInteiros.toString());  
        } 

para isso


    Iterator it1 = listaStringsOrdenadas.iterator();

    while(it1.hasNext()){
      Integer item = (Integer) it1.next();
      listaStringsOrdenadas.add(String.valueOf(item)); 
    }
    
    for (String item : listaStringsOrdenadas) {
         System.out.println(item);  
    }

[quote=Rodrigo Sasaki]Leia a minha resposta e a do entanglement. São as que resolvem seu problema de maneira mais fácil.

Aliás, na que ele postou você só precisa copiar o código.[/quote]

Está acusando erro no eclipse dizendo que o sort do Arrays.sort não se aplica a minha List :s e agora?

[quote=Murilo_Ferreira]mude isso


for (int i = 0; i&lt; ordenaInteiros.size(); i++)  
        {  
            listaStringsOrdenadas.add(ordenaInteiros.toString());  
        } 

para isso

[code]

Iterator it1 = listaStringsOrdenadas.iterator();

while(it1.hasNext()){
  Integer item = (Integer) it1.next();
  listaStringsOrdenadas.add(String.valueOf(item)); 
}

for (String item : listaStringsOrdenadas) {
     System.out.println(item);  
}

[/code][/quote]

Acusou os seguintes erros:

[code]
Iterator it1 = listaStringsOrdenadas.iterator(); //cannot convert from Iterator<String> to HTMLDocument.Iterator

	while(it1.hasNext()){  //is undefined for the type HTMLDocument.Iterator
		  Integer item = (Integer) it1.next();  //Cannot cast from void to Integer
		  listaStringsOrdenadas.add(String.valueOf(item));   
		}  
		  
		for (String item : listaStringsOrdenadas) {  
		     System.out.println(item);    
		} [/code]

[quote=jkrfabio][quote=Rodrigo Sasaki]Leia a minha resposta e a do entanglement. São as que resolvem seu problema de maneira mais fácil.

Aliás, na que ele postou você só precisa copiar o código.[/quote]

Está acusando erro no eclipse dizendo que o sort do Arrays.sort não se aplica a minha List :s e agora?[/quote]
Collections.sort

[quote=jkrfabio][quote=Murilo_Ferreira]mude isso


for (int i = 0; i&lt; ordenaInteiros.size(); i++)  
        {  
            listaStringsOrdenadas.add(ordenaInteiros.toString());  
        } 

para isso

[code]

Iterator it1 = listaStringsOrdenadas.iterator();

while(it1.hasNext()){
  Integer item = (Integer) it1.next();
  listaStringsOrdenadas.add(String.valueOf(item)); 
}

for (String item : listaStringsOrdenadas) {
     System.out.println(item);  
}

[/code][/quote]

Acusou os seguintes erros:

[code]
Iterator it1 = listaStringsOrdenadas.iterator(); //cannot convert from Iterator<String> to HTMLDocument.Iterator

	while(it1.hasNext()){  //is undefined for the type HTMLDocument.Iterator
		  Integer item = (Integer) it1.next();  //Cannot cast from void to Integer
		  listaStringsOrdenadas.add(String.valueOf(item));   
		}  
		  
		for (String item : listaStringsOrdenadas) {  
		     System.out.println(item);    
		} [/code][/quote]

oops, foi erro meu,

mude para


Iterator it1 = ordenaInteiros.iterator();

[quote=Murilo_Ferreira]
oops, foi erro meu,

me para

[code]

Iterator it1 = ordenaInteiros.iterator();

[/code][/quote]
Não foi inteiramente seu :slight_smile:
Ele importou o Iterator do pacote errado.

No meu eclipse funciona perfeitamente:


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class calcular {

	public static void main(String[] args) {

		List&lt;String&gt; lista = new ArrayList&lt;String&gt;();

		lista.add("10000");
		lista.add("20000");
		lista.add("30000");
		lista.add("40000");
		lista.add("50000");
		lista.add("60000");
		lista.add("70000");
		lista.add("80000");
		lista.add("100000");
		lista.add("90000");


		// COnvertendo lista para inteiros

		List&lt;Integer&gt; listaInteiros = new ArrayList&lt;Integer&gt;();

		for (int i = 0; i &lt; lista.size(); i++) {
			listaInteiros.add(Integer.parseInt(lista.get(i)));
		}
		
		//Inteiros ordenados
		
		Set ordenaInteiros = new TreeSet(listaInteiros);
		System.out.println(ordenaInteiros);
		
		//Convertendo lista de inteiros ordenadas corretamente para string
		
		List&lt;String&gt; listaStringsOrdenadas = new ArrayList&lt;String&gt;();
		
		Iterator it1 = ordenaInteiros.iterator();

	    while(it1.hasNext()){
	      Integer item = (Integer) it1.next();
	      listaStringsOrdenadas.add(String.valueOf(item)); 
	    }
	    
	    for (String item : listaStringsOrdenadas) {
	         System.out.println(item);  
	    }

	}
}

[quote=Murilo_Ferreira][quote=jkrfabio][quote=Murilo_Ferreira]mude isso


for (int i = 0; i&lt; ordenaInteiros.size(); i++)  
        {  
            listaStringsOrdenadas.add(ordenaInteiros.toString());  
        } 

para isso

[code]

Iterator it1 = listaStringsOrdenadas.iterator();

while(it1.hasNext()){
  Integer item = (Integer) it1.next();
  listaStringsOrdenadas.add(String.valueOf(item)); 
}

for (String item : listaStringsOrdenadas) {
     System.out.println(item);  
}

[/code][/quote]

Acusou os seguintes erros:

[code]
Iterator it1 = listaStringsOrdenadas.iterator(); //cannot convert from Iterator<String> to HTMLDocument.Iterator

	while(it1.hasNext()){  //is undefined for the type HTMLDocument.Iterator
		  Integer item = (Integer) it1.next();  //Cannot cast from void to Integer
		  listaStringsOrdenadas.add(String.valueOf(item));   
		}  
		  
		for (String item : listaStringsOrdenadas) {  
		     System.out.println(item);    
		} [/code][/quote]

oops, foi erro meu,

mude para

[code]

Iterator it1 = ordenaInteiros.iterator();

[/code][/quote]

COntinua os mesmos erros rs

[code]import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Teste{

public static void main(String[] args) throws Exception{
	List<String> lista = new ArrayList<String>();

	lista.add("10000");
	lista.add("20000");
	lista.add("30000");
	lista.add("40000");
	lista.add("50000");
	lista.add("60000");
	lista.add("70000");
	lista.add("80000");
	lista.add("90000");
	lista.add("100000");

	Collections.sort(lista, new Comparator<String>(){
		@Override
		public int compare(String o1, String o2){
			Long one = Long.parseLong(o1);
			Long other = Long.parseLong(o2);
			return one.compareTo(other);
		}
	});
	
	System.out.println(lista);

}

}[/code]


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class calcular {

	public static void main(String[] args) {

		List&lt;String&gt; lista = new ArrayList&lt;String&gt;();

		lista.add("10000");
		lista.add("20000");
		lista.add("30000");
		lista.add("40000");
		lista.add("50000");
		lista.add("60000");
		lista.add("70000");
		lista.add("80000");
		lista.add("100000");
		lista.add("90000");


		// COnvertendo lista para inteiros

		List&lt;Integer&gt; listaInteiros = new ArrayList&lt;Integer&gt;();

		for (int i = 0; i &lt; lista.size(); i++) {
			listaInteiros.add(Integer.parseInt(lista.get(i)));
		}
		
		//Inteiros ordenados
		
		Set ordenaInteiros = new TreeSet(listaInteiros);
		System.out.println(ordenaInteiros);
		
		//Convertendo lista de inteiros ordenadas corretamente para string
		
		List&lt;String&gt; listaStringsOrdenadas = new ArrayList&lt;String&gt;();
		
		Iterator it1 = ordenaInteiros.iterator();

	    while(it1.hasNext()){
	      Integer item = (Integer) it1.next();
	      listaStringsOrdenadas.add(String.valueOf(item)); 
	    }
	    
	    for (String item : listaStringsOrdenadas) {
	         System.out.println(item);  
	    }

	}
}

[quote=Rodrigo Sasaki][code]import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Teste{

public static void main(String[] args) throws Exception{
	List<String> lista = new ArrayList<String>();

	lista.add("10000");
	lista.add("20000");
	lista.add("30000");
	lista.add("40000");
	lista.add("50000");
	lista.add("60000");
	lista.add("70000");
	lista.add("80000");
	lista.add("90000");
	lista.add("100000");

	Collections.sort(lista, new Comparator<String>(){
		@Override
		public int compare(String o1, String o2){
			Long one = Long.parseLong(o1);
			Long other = Long.parseLong(o2);
			return one.compareTo(other);
		}
	});
	
	System.out.println(lista);

}

}[/code][/quote]

Essa sim seria a melhor solução