解读roller系列之----地区和时区的处理

本文介绍了一个名为StrutsUtil的类,该类用于在Struts框架中处理地区和时区信息。通过使用LocaleComparator和TimeZoneComparator进行排序,StrutsUtil能够提供排序后的地区和时区选项。

    在roller中获得地区和时区的关键类是StrutsUtil, LocaleComparatorTimeZoneComparator为辅助类,主要是实现对地区和时区的排序功能。

StrutsUtil类:

    该类将用户可以获得的地区和时区封装成ArrayList类,并实现了LabelValueBean接口,以便在采用Struts框架中显示。

代码如下:

package org.roller.presentation.util;

 

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.util.Locale;

import java.util.TimeZone;

import java.util.TreeSet;

 

import org.apache.struts.util.LabelValueBean;

import org.roller.util.LocaleComparator;

import org.roller.util.TimeZoneComparator;

 

public class StrutsUtil

{

    public static ArrayList locales;

    public static ArrayList timeZones;

   

    //-----------------------------------------------------------------------

    /**

     * LabelValueBeans are Comparable but violate the

     * equals() part of the TreeSet requirements.

     * And the html:options tag won't recognize

     * toString as a property.  So we have to put the

     * Locales into a TreeSet to sort them, then convert

     * them to LabelValueBeans to display them.

     * Glad we only have to do this once.

     *

     * @return List of LabelValueBeans, one for each locale available from the JVM

     */

    public static List getLocaleBeans()

    {

        if (locales == null)

        {

locales = new ArrayList();

//有关TreeSet的知识请参考“软道—java语言”栏目。

            TreeSet locTree = new TreeSet(new LocaleComparator());

            Locale[] localeArray = Locale.getAvailableLocales();

            for (int i=0; i<localeArray.length; i++)

            {

                locTree.add(localeArray[i]);

            }

            java.util.Iterator it = locTree.iterator();

            while (it.hasNext())

            {

                Locale loc = (Locale)it.next();

                locales.add(new LabelValueBean(

                   loc.getDisplayName(),

                   loc.toString()));

            }

 

        }

        return locales;

    }

 

    //-----------------------------------------------------------------------

    /**

     * html:options tag recognizes "ID" as a property

     * so we don't have to go through all the rigamarole (sp?)

     * that we did for Locales.

     */

    public static List getTimeZoneBeans()

    {

        if (timeZones == null)

        {

            Date today = new Date();

timeZones = new ArrayList();

//有关TreeSet的知识请参考“软道—java语言”栏目。

            TreeSet zoneTree = new TreeSet(new TimeZoneComparator());

            String[] zoneArray = TimeZone.getAvailableIDs();

            for (int i=0; i<zoneArray.length; i++)

            {

                zoneTree.add((TimeZone)TimeZone.getTimeZone(zoneArray[i]));

            }

            java.util.Iterator it = zoneTree.iterator();

            while (it.hasNext())

            {

                StringBuffer sb = new StringBuffer();

                TimeZone zone = (TimeZone)it.next();

                sb.append(zone.getDisplayName(zone.inDaylightTime(today), TimeZone.SHORT));

                sb.append(" - ");

                sb.append(zone.getID());

                timeZones.add(new LabelValueBean(

                   sb.toString(),

                   zone.getID()));

            }

        }

        return timeZones;

    }

}

 

package org.roller.util;

import java.util.Locale;

import java.util.Comparator;

import java.io.Serializable;

public class LocaleComparator implements Comparator, Serializable

{

    public int compare(Object obj1, Object obj2)

    {

        if (obj1 instanceof Locale && obj2 instanceof Locale)

        {

            Locale locale1 = (Locale)obj1;

            Locale locale2 = (Locale)obj2;

            int compName = locale1.getDisplayName().compareTo(locale2.getDisplayName());

            if (compName == 0)

            {

                return locale1.toString().compareTo(locale2.toString());

            }

            return compName;

        }

        return 0;

    }

/* Do Comparators need to implement equals()? -Lance

    public boolean equals(Object obj)

    {

        if (obj instanceof LocaleComparator)

        {

            if (obj.equals(this)) return true;

        }

        return false;

    }

*/

}

 

package org.roller.util;

import java.util.TimeZone;

import java.util.Comparator;

import java.io.Serializable;

public class TimeZoneComparator implements Comparator, Serializable

{

    public int compare(Object obj1, Object obj2)

    {

        if (obj1 instanceof TimeZone && obj2 instanceof TimeZone)

        {

            TimeZone zone1 = (TimeZone)obj1;

            TimeZone zone2 = (TimeZone)obj2;

            int compName = zone1.getDisplayName().compareTo(zone2.getDisplayName());

            if (compName == 0)

            {

                            return zone1.getID().compareTo(zone2.getID());

                     }

            return compName;

        }

        return 0;

    }

    /* Do Comparators need to implement equals()? -Lance

    public boolean equals(Object obj)

    {

        if (obj instanceof TimeZoneComparator)

        {

            if (obj.equals(this)) return true;

        }

        return false;

    }

    */

}

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化并行计算等改进策略。; 适合人群:具备一定Python编程基础优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值