读书人

java 中 时间解决思路

发布时间: 2012-12-17 09:31:40 作者: rapoo

java 中 时间
年 月
1991 11
1991 12
1992 01
1992 08
1992 09
1992 10
1993 10
1994 05
1994 06
组成之后效果变成

开始年月终止年月
199111 199201
199208 199210
199310 199310
199405 199406
那位大侠能指导下啊?用java代码
[最优解释]


package com.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;



public class Test {

public static void main(String[] args){
Map<String,String> map=new HashMap<String,String>();
String[] data={"1991-11","1991-12","1992-01","1992-08","1992-09","1992-10","1993-10","1994-05","1994-06"};
for(int i=0;i<data.length;i++){
String one=data[i];
String[] new1=one.split("-");
for(int j=0;j<data.length;j++){
String two=data[j];
String[] new2=two.split("-");
if((new1[0].equals(new2[0]) && (Integer.valueOf(new2[1])-Integer.valueOf(new1[1])==1))){//这里循环判断同年不同月的
System.out.println(one+"------"+two);
map.put(one, two);
}else if(new1[1].equals("12") && new2[1].equals("01") && (Integer.valueOf(new2[0])-Integer.valueOf(new1[0])==1)){//这里判断年相差1年,月分别是12和01月
System.out.println(one+"*****"+two);
map.put(one, two);
}
}
}

//这里遍历数据,看那些数据在map里面存在,则放入map中,键,值都是本身
for(int i=0;i<data.length;i++){
if(!map.containsKey(data[i]) && !map.containsValue(data[i])){
map.put(data[i], data[i]);
}
}

//这里是结果的result Map对象,处理类容
//1992-08 1992-09 和1992-09 1992-10组合成1992-08 1991-10
Map<String,String> result=new HashMap<String,String>();
for(String key:map.keySet()){
String value=map.get(key);
if(map.containsKey(value)){
result.put(key, map.get(value));
}else if(!map.containsValue(key)){
result.put(key, value);
}

}

for(String key:result.keySet()){
System.out.println(key+" "+result.get(key));
}






}
}




[其他解释]
package test;

public class T1 {
/**
* @param args
*/
static int year[] = { 1991, 1991, 1992, 1992, 1992, 1992, 1993, 1994, 1994 };
static int month[] = { 11, 12, 1, 8, 9, 10, 10, 05, 06 };
static int pointer = 0;

public static int next() {


if (pointer >= year.length) {
return -1;
}
return pointer++;
}

/**
* 是否为连续的年月
*
* @param y1
* @param m1
* @param y2
* @param m2
* @return
*/
static boolean isSequence(int y1, int m1, int y2, int m2) {
if (y1 == y2) {
return m2 - m1 == 1;
}
return m1 == 12 && m2 == 1;
}

public static void main(String[] args) {
int p = next();
int tmp = -1;
while (p != -1) {
// 如果是第一个数,则打印
if (tmp == -1) {
System.out.printf("%4d%02d\t", year[p], month[p]);
}
tmp = next();
// 如果没有下一个数,则输出返回
if (tmp == -1) {
System.out.printf("%4d%02d\n", year[p], month[p]);
break;
}
// 如果是顺序的,则记录新的编号
if (isSequence(year[p], month[p], year[tmp], month[tmp])) {
p = tmp;
continue;
}
// 输出尾巴
System.out.printf("%4d%02d\n", year[p], month[p]);
// 准备下一组
p = tmp;
tmp = -1;
}
}
}


[其他解释]
这样的输出,为什么得到这样的结果,有什么逻辑关系吗?
[其他解释]
组成连接的时间段,199111-199210 是连续的,所以组成一条数据。没有和199310连续的数据则单独为一条
[其他解释]
这种199310,为什么你还要单独弄一个数据出来,也就是没有独立的也要弄个数据?
[其他解释]
因为199310如果连续的话,下条数据应该是199311,但数据上没有,就但单独列出来了。
如果上一条记录和下一条记录的年月之间没有中断,则合并为一条
如果年月之间有中断,则以中断处为界 ,则将中断的数据组成一条
[其他解释]
谢谢,能帮我讲解下了吗?
[其他解释]
谢谢,能讲解下你的思路吗?
[其他解释]
我今天测试了下你的方法,当data里面的数据都是连续的则有问题?
[其他解释]
打印出连续的月份,且只输出连续月份的头和尾即可。

没啥好办法,就模拟人一样,挨个的判断就行了。

1 拿取一个数,并输出
2 拿去下一个数,没有了转5
3 如果和前一个数不连续,则输出前一个数,转1
4 连续,记录前一个数,转2
5 输出前一个数,结束

[其他解释]
我要效果并不是判断是否连续。
具体是:我数据库明细表中是以年 月两个字段存的数据,现在需要将明细表中的年月在主表中以开始年月、结束年月来存储,所以需要组合。明细表是每条显示
[其他解释]
LZ,要详细的话,加我QQ吧。472231424,
我那算法可能还有待改进,没有做太多测试,就只针对你的那个数据来写的!
[其他解释]
引用:
我要效果并不是判断是否连续。
具体是:我数据库明细表中是以年 月两个字段存的数据,现在需要将明细表中的年月在主表中以开始年月、结束年月来存储,所以需要组合。明细表是每条显示

1.数据是怎么插入数据的啊?先有明细表的数据,再有主表的?感觉应该先有主表,再有明细啊
2.是否可以根据查询条件后加order by year,month,取第一条数据作为开始时间,最后一条作为结束时间
[其他解释]
呵呵,谢谢各位大侠,我已经用一种笨方法弄出来了

读书人网 >J2SE开发

热点推荐