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

时间:2011-02-15 18:37:18

标签: java jsf

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

<1,100-500>
<2,1000-1500>
<3,500-1000>

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

100-500
500-1000
1000-1500

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

6 个答案:

答案 0 :(得分:6)

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

// this gets you a list which is not sorted as you would like
List<SelectItem> 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<SelectItem> comparator = new Comparator<SelectItem>() {
    @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());
}

答案 1 :(得分:4)

这是我快速编写的一个示例程序,它使用custom comparator

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<JLabel> listOfLabels = new ArrayList<JLabel>();

    @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

答案 2 :(得分:1)

答案 3 :(得分:1)

我使用Commons BeanUtils并用一行代码来完成它。...

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

或...

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

答案 4 :(得分:0)

按标签排序

查看“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;

答案 5 :(得分:0)

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

  /**
   * 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 );
        }
  }