排序f:基于标签的selectItems列表

我有一个selectItem值和标签列表。 数据从数据库中获取,selectItem列表具有以下值:

   

这里1,2,3是selectItem列表的值,’100-500’,’1000-1500’和’500-1000’分别是标签。 如您所见,列表已根据标签进行排序。 但我的要求是列表应显示在下拉列表中,如下所示:

 100-500 500-1000 1000-1500 

有人可以建议一个解决方案吗?

如果您无法修改从DB中获取SelectItem实例的代码,以便按照您的意愿进行排序,那么您必须自己对它们进行排序:

 // this gets you a list which is not sorted as you would like List list = getMasterValues("Staff Range"); // you need to sort the list before displaying it. // To sort the list, you need a Comparator which will tell the sorting // algorithm how to order the items Comparator comparator = new Comparator() { @Override public int compare(SelectItem s1, SelectItem s2) { // the items must be compared based on their value (assuming String or Integer value here) return s1.getValue().compareTo(s2.getValue()); } }; // now that you have the comparator, sort the list using it : Collections.sort(list, comparator); // and now iterate over the list to display it : for (SelectItem item : list) { System.out.println("value = " + item.getValue() + "; label = " + item.getLabel()); } 

这是我快速编写的一个示例程序,它使用自定义比较器 :

 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.swing.JLabel; public class StrangeSort { static List listOfLabels = new ArrayList(); @SuppressWarnings("unchecked") public static void main(String[] args) { listOfLabels.add(new JLabel("100-500")); listOfLabels.add(new JLabel("1000-1500")); listOfLabels.add(new JLabel("500-1000")); System.out.println("Before:"); for(JLabel label: listOfLabels) { System.out.println(label.getText()); } Collections.sort(listOfLabels, new LabelComparator()); System.out.println("After:"); for(JLabel label: listOfLabels) { System.out.println(label.getText()); } } static class LabelComparator implements Comparator { public int compare(Object obj1, Object obj2) { // Get labels JLabel label1 = (JLabel) obj1; JLabel label2 = (JLabel) obj2; // Get text String[] label1Text = label1.getText().split("-"); String[] label2Text = label2.getText().split("-"); // Convert to integers int label1Value = Integer.parseInt(label1Text[0]); int label2Value = Integer.parseInt(label2Text[0]); // Compare values if (label1Value > label2Value) { return 1; } else if (label1Value < label2Value) { return -1; } else { return 0; } } } } 

输出:

 Before: 100-500 1000-1500 500-1000 After: 100-500 500-1000 1000-1500 

我使用Commons BeanUtils并使用1行代码执行….

 // sort by label Collections.sort(selectItems, new BeanComparator<>("label")); 

要么…

 // sort by value Collections.sort(selectItems, new BeanComparator<>("value")); 

按标签排序

看看“JB Nizet”发布的代码。 它按价值排序。 如果你改变了
return s1.getValue().compareTo(s2.getValue());
以下内容:
return s1.getLabel().compareTo(s2.getLabel());
它将按标签排序。

按数字排序标签

以上将按字符串值排序。 这意味着1小于5(即1000 <500)。 下一步是将标签转换为数字并进行比较。 对于此用途,可以使用以下变体:

 int value1 = Integer.parseInt(s1.getLabel()); int value2 = Integer.parseInt(s2.getLabel()); return value1 - value2; 

非常感谢你的帮助。 我得到了理想的结果。 请在下面找到代码供您参考。

  /** * This is a custom comparator used for numeric sorting based on labels */ static class LabelComparator implements Comparator { public int compare(Object obj1, Object obj2) { // Get labels SelectItem label1 = (SelectItem) obj1; SelectItem label2 = (SelectItem) obj2; // Get text String[] label1Text = label1.getLabel().split("-"); String[] label2Text = label2.getLabel().split("-"); // Convert to integers int label1Value = Integer.parseInt(label1Text[0]); int label2Value = Integer.parseInt(label2Text[0]); // Compare values if (label1Value > label2Value) { return 1; } else if (label1Value < label2Value) { return -1; } else { return 0; } } } /** * Method to populate values */ public void init() { List rangeList = (List) CodeManagerUtil .getValue("Staff Range"); Collections.sort(rangeList, new LabelComparator()); if (rangeList != null) { setRangeList(rangeList ); } }