主要参考jdk的:
java.util类 Collections
java.lang.Object java.util.Collections根据指定比较器产生的顺序对指定列表进行排序。此列表内的所有元素都必须可使用指定比较器相互比较(也就是说,对于列表中的任意 e1 和 e2 元素,c.compare(e1, e2) 不得抛出 ClassCastException)。public static <T> void sort(List<T> list, Comparator<? super T> c)
此排序被保证是稳定的:不会因调用 sort 而对相等的元素进行重新排序。
排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 指定列表必须是可修改的,但不必是可大小调整的。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的 n2 log(n) 性能。
参数: list - 要排序的列表。 c - 确定列表顺序的比较器。null 值指示应该使用元素的自然顺序。 抛出: ClassCastException - 如果列表中包含不可使用指定比较器相互比较 的元素。 UnsupportedOperationException - 如果指定列表的列表迭代器不支持 set 操作。
指定排序规则对象
import java.util.Comparator; import java.util.Map; public class CompareSort implements Comparator<Object> { @Override public int compare(Object o1, Object o2) { Map.Entry map1=(Map.Entry)o1; Map.Entry map2=(Map.Entry)o2; System.out.println(map1.getKey().toString().compareTo(map2.getKey().toString())); return map1.getKey().toString().compareTo(map2.getKey().toString()); } }
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapSort { public static void main(String[] args) { Map<String, String> map=new HashMap<String, String>(); map.put("1", "qw"); map.put("a", "sdf"); map.put("r", "qw"); map.put("g", "sdf"); map.put("b", "qw"); map.put("j", "sdf"); System.out.println(map); //先将map转换为List类型 List list=new ArrayList(map.entrySet()); //然后再对list进行排序处理 Collections.sort(list, new CompareSort()); System.out.println(list); } }
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
我们先构建报表,空白模板,示例数据库和sql查询数据源,数据集setOrders,如下
select
CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,
CLASSICMODELS.ORDERS.ORDERNUMBER,
CLASSICMODELS.ORDERS.ORDERDATE,
CLASSICMODELS.ORDERS.STATUS,
CLASSICMODELS.ORDERDETAILS.QUANTITYORDERED,
CLASSICMODELS.ORDERDETAILS.PRICEEACH
from
CLASSICMODELS.CUSTOMERS,
CLASSICMODELS.ORDERS,
CLASSICMODELS.ORDERDETAILS
where
CLASSICMODELS.CUSTOMERS.CUSTOMERNUMBER = CLASSICMODELS.ORDERS.CUSTOMERNUMBER
and
CLASSICMODELS.ORDERS.ORDERNUMBER = CLASSICMODELS.ORDERDETAILS.ORDERNUMBER
我们要先以客户名称分组,再以订单号分组:
那么我们在布局好了普通网格报表之后,在详细行上右击,选择插入分组
首先插入分组grpCustomerName,分组依据CUSTOMERNAME,目录的项目表达式为:row["CUSTOMERNAME"] + ": $(" + row["CUSTOMERTOTAL"].toFixed(2) + ")USD"
3. 设置分组的属性:
� 输入该分组的名称,该名称唯一标识该组,而且该名称会出现在右键菜单“编辑组”当中,您可以非常方便的编辑指定的组。
� 选择分组依据。在下拉框中给您列出了当前表所绑定的所有列,这些列可以不在表中显示。选择数据集上的可用列作为一个分组或者用表达式生成器去构建一个数据绑定作为分组依据
� 设置分组间隔。您可以设置一种分组间隔类型,然后指定分组间隔值。关于如何设置间隔,请参考后面小节“按间隔分组数据”。
� 设置是否要隐藏详细信息。您可以选中该复选框来隐藏表格当中的明细信息,从而只显示组头或组尾的汇总数据。
� 设置目录的项目表达式。项目表达式:指定目录的标题的表达式,可以选择数据集上的可用列作为一个分组或者用表达式生成器去构建一个数据绑定作为分组依据,样式用来指定标题的样式
� 设置排序方向。选择数据分组后,各组按升序还是降序排列。
� 设置分页。您可以设置报表在什么位置分页。如果您想让每组数据都在单独的页面上显示,那么您可以在组之前或之后设置一下分页。
� 设置筛选。您可以添加一个或多个筛选对组中的数据进行筛选。
� 设置排序。您可以设置组内数据的排序。
排序方向:用于指定分组的排序
换页:用于指定换页之后是否重复标题
排序与过滤:用于指定排序的依据和过滤的依据
我们再插入分组grpOrderNumber,分组依据ORDERNUMBER,目录的项目表达式为:"Order Number: " + row["ORDERNUMBER"] + "\n$(" + row["ORDERTOTAL"].toFixed(2) + ")USD"
做适当的布局:
其中:
TOTALSALE绑定:dataSetRow["QUANTITYORDERED"] * dataSetRow["PRICEEACH"]
ORDERTOTAL绑定:Total.sum(row["TOTALSALE"])
CUSTOMERTOTAL绑定:Total.sum(row["TOTALSALE"])
做适当的页面美化,我们就能看到这样的预览效果
7.2 分组的排序与过滤
如果没有添加排序依据,那么就依据默认的排序单选进行排序
如果添加有排序依据,则会覆盖默认的排序依据:
其中,分组的键可以用分组依据,也可以用表达式生成器构建;
方向可以是升序或是降序;
语言环境选自动即可;
排序依据必须是和分组依据一一关联的,不能是多对一,比如本分组不能使用row["ORDERDATE"],否则排序依据失效;
有多个排序依据时则依照sql的排序依据顺序执行;
过滤器:
其中筛选条件中的表达式生成器可以是分组的字段,也可以是表达式生成器生成的
注意的是过滤依据必须是和分组依据一一关联的,不能是多对一,比如本分组不能使用row["ORDERDATE"],否则过滤依据失效;
这样我们就筛选出销售额前3名的客户分组。
我们还可以构建多个筛选条件。
7.3 分组的间隔,聚合,可视性,映射,突出显示,书签当您创建分组时,BIRT报表默认是按每个分组依据值来分组数据的,比如一个客户名,一个国家名,或者一个日期。在前面我们创建的客户信息表中,BIRT报表将每个国家作为一组,在每组下面列出这个国家所有客户信息。有时按指定的间隔来分组数据更加有用。比如说一张销售报表可以按季度来分组销售数据,而不是按照详细的日期分组。同样您也可以按周或月来分组发货报表,而非按照详细的日期。
比较下面两张报表,第一张将订单信息按详细的日期分组,而第二张报表则按月份来分组订单信息。
通过上面两张报表您可以看到,有些时候设置分组间隔能够更好的组织数据,更加便于用户查看:
� 设置分组间隔可以将很长的报表分隔成为许多短小的,更便于阅读的“块”。
� 设置分组间隔可以对该间隔期的数据进行汇总,更便于分析。
下面给您更加详细的介绍如何设置分组依据为字符串、数值与时间日期的分组间隔
设置字符串的分组间隔
当您设置分组字符串数据的分组间隔时,该分组间隔是一个特定长度的字符串前缀。比如将客户信息按客户名分组,您可以按照客户名的第一个字母,前两个字母等来分组。
一般情况下,报表在显示名字/名称列表时,会按名字/名称的第一个字母来分组。比如一张客户信息表,我们会将客户信息按它们名称的第一个字母来分组,名称以A 开头的客户分为一组,以B 开头的客户分为一组,以此类推。您还可以设置多个字母间隔来对字符串分组,来将那些名称里面包含多个特定字母的前缀按这个前缀分组。比如一个产品名称中,可能开头两个字母表示供应商,如ME, MO 等,那么我们就可以按前两个字母前缀来对产品名称分组。下面就是我们按一个字母前缀、两个字母前缀、三个字母前缀来对客户名称分组的例子。
设置字符串分组间隔
1. 首先按前面小节中介绍的步骤来创建分组,分组依据为字符串类型。
2. 在间隔中设置“前缀”,
3. 在“区域”中设置需要按前几个字符作为前缀来对字符串分组。
我们建立数据集customer:
select CLASSICMODELS.CUSTOMERS.CUSTOMERNAME,CLASSICMODELS.CUSTOMERS.CONTACTLASTNAME,CLASSICMODELS.CUSTOMERS.PHONE,CLASSICMODELS.CUSTOMERS.ADDRESSLINE1,CLASSICMODELS.CUSTOMERS.CITY,CLASSICMODELS.CUSTOMERS.STATE,CLASSICMODELS.CUSTOMERS.COUNTRY,CLASSICMODELS.CUSTOMERS.CREDITLIMIT
from CLASSICMODELS.CUSTOMERS
当您对数值数据分组时,您也可以设置分组间隔。比如您制作订单信息表时,当订单号为数值型时,可以按订单号每50&nb