Gente, estou com um problema e gostaria de saber se alguém tem uma solução para ajudar…
MenuVO m = new MenuVO();
m.setItem(3);
ArrayList al = new ArrayList();
al.add(m.getItem(), m);
isso é mais ou menos o que preciso… as duas primeiras linhas são só pra entender como é a classe MenuVO, vou ter uma lista delas e tenho que colocar no ArrayList, ou outra coleção, na ordem do id do menu, só que no ArrayList não funciona pois dá erro “java.lang.IndexOutOfBoundsException: Index: 3, Size: 0”
na verdade preciso guardar todos os MenuVO e depois lê-los na ordem do id deles, tinha pensado no ArrayList, mas to achando que não vai rolar…
alguém tem alguma solução ou sugestão?
Ola,
Adicione os menus, simplismente no list, depois vc manda ele ordenar pelo id do menu… pois da forma que vc tá fazendo ele sempre vai lançar arryaindexoutbound… pq vc não pode incluir na posição 4 sem ter incluido nada na 3… mesmo que inclua null…
Olha um ex.:
[code]
List menus…
…//adiciona usando simplesmente o add(myMenuVo);
Collections.sort(menus, new Comparator(){
public int compare(MenuVO m1, MenuVO m2){
if(m1.getId() < m2.getId()){
return -1;
}
if(m1.getId() > m2.getId()){
return 1;
}
return 0;
}
});[/code]
Use um mapa:
[code] MenuVO m = new MenuVO();
m.setItem(3);
Map<Integer, MenuVO> menuMap = new HashMap<Integer, MenuVO>();
menuMap.add(m.getItem(), m);[/code]
O problema do mapa é retornar na ordem depois…
estou tentando com TreeMap, parece que vai dar certo, mas como o meu problema é principalmente performance vou testar depois a solução do Collections.sort para ver o que fica mais rápido
[quote=danielbchaves]O problema do mapa é retornar na ordem depois…
estou tentando com TreeMap, parece que vai dar certo, mas como o meu problema é principalmente performance vou testar depois a solução do Collections.sort para ver o que fica mais rápido[/quote]
Ola, em questão de performace… acho que vc só vai sentir algo com MUITO menu… ou se tiver que fazer isto diversas vezes…
Mas vc pode tb usar o map, e quando for recuperar pegar o keySet dele, ordenar e depois recuperar…
Só complementando o que o pessoal disse, caso queira usar Map e precise que ele mantenha a ordem em que os itens foram inseridos (insertion-order), use LinkedHashMap. Leia a documentação para mais detalhes. =]
Mas nesse caso, acho q a melhor opção seja fazer utilizando List mesmo. Já que o atributo “item” terá um número inteiro e ele deve ser o índice do List, tenha o cuidado de inserir já na ordem correta. Isso economizaria um atributo na classe MenuVO.
List<MenuVO> listaMenus = new ArrayList<MenuVO>();
listaMenus.add(menu1);
listaMenus.add(menu2);
listaMenus.add(menu3);
(...)
listaMenus.add(menuN);
Caso isso não seja possível, o melhor é usar Collections.sort() mesmo, como o BrunoCarlo disse. Porém há uma maneira mais simples se vc tiver o jar commons-beanutils do projeto Jakarta Commons:
List<MenuVO> listaMenus = new ArrayList<MenuVO>();
Collections.sort(listaMenus, new BeanComparator("item"));
Espero ter ajudado. Até.
O codigo necessário para comparador é apenas:
Collections.sort(menus, new Comparator<MenuVO>(){
public int compare(MenuVO m1, MenuVO m2){
return m1.getId() - m2.getId();
}
});
O outro não está errado, mas este é mais simples.
.oO(Interrogo-me de onde o pessoal tirou a ideia de que tem que retorna exatamente -1, 0 ou 1)
[quote=danielbchaves]O problema do mapa é retornar na ordem depois…
estou tentando com TreeMap, parece que vai dar certo, mas como o meu problema é principalmente performance vou testar depois a solução do Collections.sort para ver o que fica mais rápido[/quote]
Todos os seus itens de menu tem um numero de item diferente , ou podem existir menus com o mesmo numero para o campo item ?
Se todos são diferentes , utilizando o comparador já explicado vc deve usar TreeSet. Ele coloca na ordem certa na hora que vc dá o add e itera nessa mesma ordem. Se isso é mais rápido que Collections.sort não sei, mas é mais claro.
Não é necessário usar Map pq vc não vai usar o numero do item para recuperar o objeto menu.Vc só quer impôr Ordem.
Sergio, só lembrando que esse seu comparador só funciona desde que todos os números sejam positivos. O que costuma a ser verdade em IDs.