2013-11-26 122 views
0

我正在做的是从地图获取元素并将它们添加到JList以显示在GUI上。我想知道如何按字母顺序排列名称。按名称排序JList

private void refreshShopsList() { 
    gameShopsJList.setModel(new javax.swing.AbstractListModel<String>() { 

     public int getSize() { 
      return ShopsLoader.getShops().size(); 
     } 

     public String getElementAt(int i) { 
      return getShopByIndex(i).getName(); 
     } 
    });  
} 

private Shop getShopByIndex(int index) { 
    Iterator<Entry<String, Shop>> it = ShopsLoader.getShops().entrySet().iterator(); 
    int count = -1; 
    while(it.hasNext()) { 
     Entry<String, Shop> entry = it.next(); 
     count++; 
     if (count == index) 
      return entry.getValue(); 
    } 
    return null; 
} 

/** 
* The map of the shops 
*/ 
private static final Map<String, Shop> shops = new HashMap<String, Shop>(); 

public static Map<String, Shop> getShops() { 
    return shops; 
} 
+0

完成的AbstractListModel(空torzo),那么将有可能提出好的建议......,为更好地帮助越早张贴SSCCE,短,可运行,编译,从局部变量或枚举中为Map 提供硬编码值 – mKorbel

+0

只需将'Map'从'HashMap'更改为'TreeMap'就可以完成这项工作。但是,对每个'getElementAt'调用执行线性映射迭代的列表模型的设计都值得怀疑。 – Holger

+1

只有一列使用'JTable'。 'JTable'通过点击标题内置了排序。默认分拣机可以对字符串进行排序 – Robin

回答

0

这是一个小例子,它将您的商店名称排序。

的ShopComparator类完成分拣作业:

package model; 

import java.util.Comparator; 

public class ShopComparator implements Comparator<Shop> { 

    @Override 
    public int compare(Shop o1, Shop o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 

} 

的店铺等级,尽可能简单:

package model; 

public class Shop { 

    private int id; 
    private String name; 

    public Shop(int id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

和主要应用:

package model; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 
import java.util.TreeSet; 

public class App { 

    public static void main(String[] args) { 
     Map<String, Shop> shops = new HashMap<String, Shop>(); 
     Shop s1 = new Shop(1, "Apus Drugstore"); 
     Shop s2 = new Shop(2, "DM"); 
     Shop s3 = new Shop(3, "Kaufhof"); 
     Shop s4 = new Shop(4, "Moes Traverne"); 

     shops.put("one", s3); 
     shops.put("two", s4); 
     shops.put("three", s1); 
     shops.put("four", s2); 

     for(Shop s : shops.values()) { 
      System.out.println(s.getName()); 
     } 
     ShopComparator sc = new ShopComparator(); 
     TreeSet<Shop> sortedShops = new TreeSet<>(sc); 

     sortedShops.addAll(shops.values()); 

     for(Shop s : sortedShops) { 
      System.out.println(s.getName()); 
     } 
    } 

} 

首页输出,未分类: Moes Traverne Kaufhof Apus药店 DM

和排序的输出。

阿普斯药店 DM 考夫霍夫 教育和体育部Traverne

0

算法:

  1. 获得的所有值从JList中,他们
  2. 设置新值转换为字符串,存放于数组
  3. 排序数组的JList。

代码:

JList jl = new JList(new Object[]{4.5,1,"Hi!"}); 
    ListModel model = jl.getModel(); 
    String[] strings = new String[model.getSize()]; 
    for(int i=0;i<strings.length;i++){ 
     strings[i]=model.getElementAt(i).toString(); 
    } 
    Arrays.sort(strings); 
    jl.setListData(strings);  

看到Comparator如果您需要任何其他顺序进行排序阵列。