代码之家  ›  专栏  ›  技术社区  ›  tgai

泛型与性能问题

  •  0
  • tgai  · 技术社区  · 14 年前

    我想知道是否有人可以查看我编写的类,我在eclipse中收到了一般警告,我只是想知道是否可以彻底清理它。我收到的所有警告都包含在下面的代码中。

    这个类以(hh:mm am/pm)的形式获取字符串列表,并将它们转换为hourminute对象,以便在列表中找到当前时间之后的第一个时间。

    我也很好奇是否有更有效的方法来做到这一点。这很好,但我的学生只是想知道我如何能做得更好。

    public class FindTime {
        private String[] hourMinuteStringArray;
    
        public FindTime(String[] hourMinuteStringArray){
            this.hourMinuteStringArray = hourMinuteStringArray;
        }
    
        public int findTime(){
    
            HourMinuteList hourMinuteList = convertHMStringArrayToHMArray(hourMinuteStringArray);
            Calendar calendar = new GregorianCalendar();
            int hour = calendar.get(Calendar.HOUR_OF_DAY);
            int minute = calendar.get(Calendar.MINUTE);
            HourMinute now = new HourMinute(hour,minute);
            int nearestTimeIndex = findNearestTimeIndex(hourMinuteList, now);
            return nearestTimeIndex;
        }
    
        private int findNearestTimeIndex(HourMinuteList hourMinuteList, HourMinute now){
            HourMinute current;
            int position = 0;
            Iterator<HourMinute> iterator = **hourMinuteList.iterator()**;
            while(iterator.hasNext()){
                current = (HourMinute) iterator.next();
                if(now.compareTo(current) == -1){
                    return position;
                }
                position++;
            }
            return position;
        }
    
    
        private static HourMinuteList convertHMStringArrayToHMArray(String[] times){
            FindTime s = new FindTime(new String[1]);
            HourMinuteList list = s.new HourMinuteList();
            String[] splitTime = new String[3];
            for(String time : times ){
                String[] tempFirst = time.split(":");
                String[] tempSecond = tempFirst[1].split(" ");
                splitTime[0] = tempFirst[0];
                splitTime[1] = tempSecond[0];
                splitTime[2] = tempSecond[1];
                int hour = Integer.parseInt(splitTime[0]);
                int minute = Integer.parseInt(splitTime[1]);
                HourMinute hm;
                if(splitTime[2] == "AM"){
                    hm = s.new HourMinute(hour,minute);
                }
                else if((splitTime[2].equals("PM")) && (hour < 12)){
                    hm = s.new HourMinute(hour + 12,minute);
                }
                else{
                    hm = s.new HourMinute(hour,minute);
                }
    
                **list.add(hm);**
            }
            return list;
        }
        class **HourMinuteList** extends **ArrayList** implements RandomAccess{
    
        }
        class HourMinute implements **Comparable** {
            int hour;
            int minute;
    
            public HourMinute(int hour, int minute) {
                setHour(hour);
                setMinute(minute);
            }
    
            int getMinute() {
                return this.minute;
            }
            String getMinuteString(){
                if(this.minute < 10){
                    return "0" + this.minute;
                }else{
                    return "" + this.minute;
                }
            }
    
            int getHour() {
                return this.hour;
            }
    
            void setHour(int hour) {
                this.hour = hour;
            }
    
            void setMinute(int minute) {
                this.minute = minute;
            }
    
            @Override
            public int compareTo(Object aThat) {
    
                if (aThat instanceof HourMinute) {
                    HourMinute that = (HourMinute) aThat;
                    if (this.getHour() == that.getHour()) {
                        if (this.getMinute() > that.getMinute()) {
                            return 1;
                        } else if (this.getMinute() < that.getMinute()) {
                            return -1;
                        } else {
                            return 0;
                        }
                    } else if (this.getHour() > that.getHour()) {
                        return 1;
                    } else if (this.getHour() < that.getHour()) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
    
                return 0;
            }
    
        }
    
    
    If you have any questions let me know. 
    
    Thanks, 
    Rob
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Eyal Schneider    14 年前

    我不会使用hourminute类,除非它有其他附加值。如果只需要查找给定时间点之后最近的事件时间,请将字符串转换为日期(或表示时间的长值),并将它们存储在某个排序的集合中。 转换可以用 日期格式 .

    如果动态添加项,请使用 树集<日期> ,以及天花板(T)/更高(T)的方法。

    如果项集不是动态的,请使用数组 日期[ ]日期 ,以及数组。二进制搜索(…)。

    以下是第一种方法的(工作)草案:

    public class TimedEventsMgr {
        private TreeSet<Date> pointsInTime = new TreeSet<Date>();
        private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm a");
    
        //timeStr: hh:mm AM/PM
        public void add(String timeStr) throws ParseException{
            Date time = sdf.parse("20000101 "+timeStr);
            pointsInTime.add(time);
        }
    
        public Date closestFutureTime(Date time){
            Calendar c = Calendar.getInstance();
            c.setTime(time);
            c.set(Calendar.YEAR, 2000);
            c.set(Calendar.MONTH, 0); //January
            c.set(Calendar.DATE, 1);
            return pointsInTime.higher(c.getTime());
        }
    }
    
        2
  •  5
  •   Igor Artamonov    14 年前

    这是因为您没有为列表和可比较实例指定泛型,因此可以支持泛型。您可以使用以下命令重写代码:

    class HourMinuteList extends ArrayList<HourMinute> implements RandomAccess{
    
    }
    class HourMinute implements Comparable<HourMinute> {
    
       public int compareTo(HourMinute aThat) {
       ....
      }
    }
    

    注意:泛型不是必需的,也不在运行时使用,但是最好使用它们,因为它可以帮助您避免代码中的一些错误。