Como usar mais de um Comparator em um TreeMap?

Pessoal,
pesquisei mas não consegui uma resposta…

Eu tenho a minha Classe AgenciaAutomoveis classificada por Modelo da seguinte forma…

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;


public class TreeMapClassificada {
  public static void main(String [] args){
    
	  AgenciaAutomoveis auto1 = new AgenciaAutomoveis(1999, "Gol");
	  AgenciaAutomoveis auto2 = new AgenciaAutomoveis(2007, "Palio");
	  AgenciaAutomoveis auto3 = new AgenciaAutomoveis(2009, "EcoSport");
	  AgenciaAutomoveis auto4 = new AgenciaAutomoveis(1992, "Uno");
	  
	  ComparatorAgenciaByNomeCarro compare = new ComparatorAgenciaByNomeCarro();
	  Map mapa = new TreeMap(compare);
	  mapa.put(auto1, 7500);
	  mapa.put(auto2, 15000);
	  mapa.put(auto3, 22000);
	  mapa.put(auto4, 2300);
	  
	  System.out.println(mapa);
	  
  }
}


class AgenciaAutomoveis{
	
	Integer ano;
	String nomeCarro;
	
	AgenciaAutomoveis(Integer ano, String modelo){
		super();
		this.ano = ano;
		this.nomeCarro = modelo;
	}
	
	public String toString(){
	  return "Ano: " + ano + " " + "Modelo: " + nomeCarro + " ";
	}
}

class ComparatorAgenciaByNomeCarro implements Comparator <AgenciaAutomoveis>{ 
	public int compare(AgenciaAutomoveis agencia1, AgenciaAutomoveis agencia2){
		return agencia1.nomeCarro.compareTo(agencia2.nomeCarro);
	}
}

O código imprime a classificação por nome do Carro: {Ano: 2009 Modelo: EcoSport =22000, Ano: 1999 Modelo: Gol =7500, Ano: 2007 Modelo: Palio =15000, Ano: 1992 Modelo: Uno =2300}

Pois bem…
Mas e se eu quiser que a classificação seja feita pelo Ano, é possível?

Se eu utilizar um List, eu consigo classificar através de Collections.sort(), passando a minha classe e o Comparator desejado.
Mas no caso do TreeMap este Comparator é passado no momento da criação do objeto, ai fiquei com esta dúvida.

Sinceramente acho que não tem como, só se tiver alguma gambiarra pois o objeto foi criado pra ser classificado dessa maneira.

Alguém pode ajudar?

Grato!!!

a) Dentro da medida do possível, use sempre Generics (a menos que você tenha de usar Java 1.4 ou anterior. Shit happens…)
b) Você tem de criar um TreeMap diferente (talvez com os mesmos dados) para cada critério de ordenação. Ou seja, crie um método que já insere seu objeto AgenciaAutomoveis em vários treemaps, cada qual com seu Comparator diferente. Crie outro método que remove seu objeto AgenciaAutomoveis dos vários treemaps também.
c) Normalmente é aconselhável você criar variáveis com o tipo da interface, não da classe, a menos que você tenha de usar algum método que só existe na classe.
d) Um comparator normalmente não precisa ter várias instâncias, apenas uma.

 class ComparatorAgenciaByNomeCarro implements Comparator &lt;AgenciaAutomoveis&gt;{   
     public int compare(AgenciaAutomoveis agencia1, AgenciaAutomoveis agencia2){  
         return agencia1.nomeCarro.compareTo(agencia2.nomeCarro);  
     }  
     public static ComparatorAgenciaByNomeCarro getInstance() { return instance; }
     protected ComparatorAgenciaByNomeCarro() {};
     private static ComparatorAgenciaByNomeCarro instance = new ComparatorAgenciaByNomeCarro();
 }  
 ...
 SortedMap&lt;AgenciaAutomoveis, Double&gt; precos = new TreeMap&lt;AgenciaAutomoveis, Double&gt;(ComparatorAgenciaByNomeCarro.getInstance());

(Concordo que generics é realmente muito verboso, mas depois você economiza com castings.)

Entendi…
Então na vida real talvez seja muito custoso ficar criando vários métodos para ter classificações diferentes, pois vou ter que os mesmos objetos em vários TreeMap´s.
É isso mesmo?

Agora, com relação ao exame, é comum ter várias classificações usando TreeMap?

Valeu.

Com relação ao exame não… um comparator apenas por exercicio, se houver…

Você só usa mesmo uma instância, não há sentido haver várias…

para reordenar, so criando um novo TreeMap … algo como:

SortedMap<AgenciaAutomoveis, Double> outraOrdem = new TreeMap<AgenciaAutomoveis, Double>(novoComparator);
outraOrdem.putAll(mapaAntigo);

hum… interessante…
Não sabia deste método putAll(mapaAntigo)

obrigado.