关于数组转入list集合删除连续重复的问题

晋儿 2013-11-24 03:27:04
我这里的意思是只有两个元素相邻并相同才算重复,如果两个元素相同但没有挨在一起就不算重复,
比如下面例子,红颜色的两个与绿色的两个属性相同但不相邻不算重复。蓝色的三个与黑色的三个
属性相同但相邻挨在一起所以算重复。删除处理后只保留第一次出现的元素如下所示:
文件是以BufferedReader的 reader.readLine()方法先读出来放入数组,然后再根据设备屏幕要显示显示多少行,把数组放入list,在屏幕上画条形图的,欢迎大家出谋划策,不胜感激
另外提醒大家一下回帖时输入“股 票”字样的时候中间要留空格,不然回帖会提示字符非法。郁闷吖!
我又发了一个帖子在这里,麻烦大家过去看看好吗?链接是:http://bbs.csdn.net/posts/396163680

日期 开盘 收盘
09/23/2013, 2192.23 ,2198.11
09/24/2013, 2219.47 ,2219.54
09/25/2013, 2192.23 ,2198.11
09/26/2013, 2219.47 ,2219.54
09/27/2013, 2150.96 ,2165.78
09/28/2013, 2150.96 ,2165.78
09/29/2013, 2150.96 ,2165.78

09/30/2013, 2167.73 ,2176.30
10/01/2013, 2167.73 ,2176.30
10/02/2013, 2167.73 ,2176.30
上面的数据处理后要求变成下面这样:
日期 开盘 收盘
09/23/2013, 2192.23 ,2198.11
09/24/2013, 2219.47 ,2219.54
09/25/2013, 2192.23 ,2198.11
09/26/2013, 2219.47 ,2219.54
09/27/2013, 2150.96 ,2165.78 这里要求只剩下第一次出现的日期九月27日,而28日与29日删除。
09/30/2013, 2167.73 ,2176.30 这里要求只剩下第一次出现的日期九月30日,而十月1日与十月2日删除。
大家明白了吗,谢谢回复


小弟最近在开发股 票软件时,从网上下载股 票原始文件时有个删除重复的方法一直想不出来。
原始文件是c s v或t x t的文件,格式如下:分行读取,每行又以逗号分割成交易日期,开盘价,
收盘价三个属性。本来周六周日与节假日是不交易的,原始数据却是把周六周日与节假日之前的
一天的开盘收盘价, 顺延下去填充到非交易日里,这样就造成了重复,意思就是所有非交易日里
的开盘与收盘价跟前一天是相同的。这就造成了一个问题,如何删除这些重复的非交易日与数据,
并且还要保持日期先后顺序不变? 我用数组去重复的一般方法不行,这样会把不相邻的重复也删除了。
我这里如果日期不相邻就不算重复。就像下面 09/23/2013日与09/25/2013日都是2199.36,2223.07但
两个日期不相邻,不算重复。
处理后如下所示:看左边与 右边的对照。我的意思是可以不用直接处理原始文件,但读取的时候
要按要按处理后的格式读出来,后面我把我的源代码贴出来(还有一个数据的源文件附件)
等待大家帮忙解决。
日期 开盘 收盘(逗号分割) 日期 开盘 收盘(逗号分割)
09/23/2013,2199.36,2223.07 09/23/2013,2199.36,2223.07
09/24/2013,2219.47,2219.54 09/24/2013,2219.47,2219.54
09/25/2013,2199.36,2223.07 09/25/2013,2199.36,2223.07
09/26/2013,2192.23,2192.23 09/26/2013,2192.23,2192.23
09/27/2013,2150.96,2165.78 09/27/2013,2150.96,2165.78
09/28/2013,2150.96,2165.78 这两天是周六日要删除,这两天
09/29/2013,2150.96,2165.78 的价格与前面相邻的周五相同
09/30/2013,2167.73,2176.30 09/30/2013,2167.73,2176.30
10/01/2013,2167.73,2176.30 这七天是长假日也要删除,这
10/02/2013,2167.73,2176.30 七天与前面相邻的09/30/2013
10/03/2013,2167.73,2176.30 日价格相同
10/04/2013,2167.73,2176.30
10/05/2013,2167.73,2176.30
10/06/2013,2167.73,2176.30
10/07/2013,2167.73,2176.30
10/08/2013,2171.90,2200.02 10/08/2013,2171.90,2200.02
10/09/2013,2191.39,2212.35 10/09/2013,2191.39,2212.35
10/10/2013,2214.41,2214.59 10/10/2013,2214.41,2214.59
10/11/2013,2201.41,2228.87 10/11/2013,2201.41,2228.87



...全文
237 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdgdf566 2013-11-24
  • 打赏
  • 举报
回复
那就改成:

        float PriceOpenTemp = 0;
        float PriceCloseTemp = 0;
        int lineNumber = 0;
        for (int i = 0; i <= 18; i++) {
            if (PriceOpenTemp == BarsData.get(i).PriceOpen && PriceCloseTemp == BarsData.get(i).PriceClose) {
                continue;
            }
            System.out.println("行号是:" + lineNumber + "  "
                    + "日期是:" + BarsData.get(i).BarDate + "  "
                    + "开盘是:" + BarsData.get(i).PriceOpen + "  "
                    + "收盘是:" + BarsData.get(i).PriceClose);
            PriceOpenTemp = BarsData.get(i).PriceOpen;
            PriceCloseTemp = BarsData.get(i).PriceClose;
            lineNumber++;
        }
晋儿 2013-11-24
  • 打赏
  • 举报
回复
引用 3 楼 jdgdf566 的回复:
73至78行改成:

        float PriceOpenTemp = 0;
        float PriceCloseTemp = 0;
        for (int i = 0; i <= 18; i++) {
            if (PriceOpenTemp == BarsData.get(i).PriceOpen && PriceCloseTemp == BarsData.get(i).PriceClose) {
                continue;
            }
            System.out.println("行号是:" + BarsData.get(i).BarNum + "  "
                    + "日期是:" + BarsData.get(i).BarDate + "  "
                    + "开盘是:" + BarsData.get(i).PriceOpen + "  "
                    + "收盘是:" + BarsData.get(i).PriceClose);
            PriceOpenTemp = BarsData.get(i).PriceOpen;
            PriceCloseTemp = BarsData.get(i).PriceClose;
        }
感谢大哥的指点。我试了你的方法去除了重复, 但行号不连续原来的从0到18连续的: 行号是:0 日期是:Mon Sep 23 00:00:00 CST 2013 开盘是:2199.36 收盘是:2223.07 行号是:1 日期是:Tue Sep 24 00:00:00 CST 2013 开盘是:2219.47 收盘是:2219.54 行号是:2 日期是:Wed Sep 25 00:00:00 CST 2013 开盘是:2206.23 收盘是:2217.97 行号是:3 日期是:Thu Sep 26 00:00:00 CST 2013 开盘是:2192.23 收盘是:2192.23 行号是:4 日期是:Fri Sep 27 00:00:00 CST 2013 开盘是:2150.96 收盘是:2165.78 行号是:5 日期是:Sat Sep 28 00:00:00 CST 2013 开盘是:2150.96 收盘是:2165.78 行号是:6 日期是:Sun Sep 29 00:00:00 CST 2013 开盘是:2150.96 收盘是:2165.78 行号是:7 日期是:Mon Sep 30 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:8 日期是:Tue Oct 01 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:9 日期是:Wed Oct 02 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:10 日期是:Thu Oct 03 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:11 日期是:Fri Oct 04 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:12 日期是:Sat Oct 05 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:13 日期是:Sun Oct 06 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:14 日期是:Mon Oct 07 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 行号是:15 日期是:Tue Oct 08 00:00:00 CST 2013 开盘是:2171.9 收盘是:2200.02 行号是:16 日期是:Wed Oct 09 00:00:00 CST 2013 开盘是:2191.39 收盘是:2212.35 行号是:17 日期是:Thu Oct 10 00:00:00 CST 2013 开盘是:2214.41 收盘是:2214.59 行号是:18 日期是:Fri Oct 11 00:00:00 CST 2013 开盘是:2201.41 收盘是:2228.87 处理后的是不连续的中间有跳空画不出连续的图图来:下面的剩下的九个要按行号从0到8 的顺序排成连续的,反正大哥已费心看了我的代码,就不在乎再帮忙修改一下,谢谢了!!! 我尽量把我的意图说明白不知道大哥看明白没有! 行号是:0 日期是:Mon Sep 23 00:00:00 CST 2013 开盘是:2199.36 收盘是:2223.07 行号是:0 行号是:1 日期是:Tue Sep 24 00:00:00 CST 2013 开盘是:2219.47 收盘是:2219.54 行号是:1 行号是:2 日期是:Wed Sep 25 00:00:00 CST 2013 开盘是:2206.23 收盘是:2217.97 行号是:2 行号是:3 日期是:Thu Sep 26 00:00:00 CST 2013 开盘是:2192.23 收盘是:2192.23 行号是:3 行号是:4 日期是:Fri Sep 27 00:00:00 CST 2013 开盘是:2150.96 收盘是:2165.78 行号是:4 行号是:7 日期是:Mon Sep 30 00:00:00 CST 2013 开盘是:2167.73 收盘是:2176.3 改成行号是:5 行号是:16 日期是:Wed Oct 09 00:00:00 CST 2013 开盘是:2191.39 收盘是:2212.35 改成行号是:6 行号是:17 日期是:Thu Oct 10 00:00:00 CST 2013 开盘是:2214.41 收盘是:2214.59 改成行号是:7 行号是:18 日期是:Fri Oct 11 00:00:00 CST 2013 开盘是:2201.41 收盘是:2228.87 改成行号是:8
jdgdf566 2013-11-24
  • 打赏
  • 举报
回复
73至78行改成:

        float PriceOpenTemp = 0;
        float PriceCloseTemp = 0;
        for (int i = 0; i <= 18; i++) {
            if (PriceOpenTemp == BarsData.get(i).PriceOpen && PriceCloseTemp == BarsData.get(i).PriceClose) {
                continue;
            }
            System.out.println("行号是:" + BarsData.get(i).BarNum + "  "
                    + "日期是:" + BarsData.get(i).BarDate + "  "
                    + "开盘是:" + BarsData.get(i).PriceOpen + "  "
                    + "收盘是:" + BarsData.get(i).PriceClose);
            PriceOpenTemp = BarsData.get(i).PriceOpen;
            PriceCloseTemp = BarsData.get(i).PriceClose;
        }
失落夏天 2013-11-24
  • 打赏
  • 举报
回复
这个我觉得甚至都用不着list 你读第一行的时候找个对象缓存一下,再读第二行的时候对比一下是否一样,然后把第二行赋值那个对象,继续读第三行。
jdgdf566 2013-11-24
  • 打赏
  • 举报
回复
对java来说,没有什么难度啊。你尽管做就可以了。

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧