HashSet/List 排序

要求:用户从外部导入TXT文件(input textfile),该文件有三列,分别是storeNum,MosrName,MosrNum,如下是一个input textfile的Case:

5099,Scoresby,5659
5250,Scoresby,5659
5211,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5250,Scoresby,5659
5250,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5130,Scoresby,5659
5131,Scoresby,5659
5211,Scoresby,5659
5250,Scoresby,5659

为了程序后续处理该文件,需要验证如下两点:
1)input textfile中可以出现空行,如有空行要忽略它。

2)向用户报告哪些行的storeNum是重复的,报告的格式如下:

Line #1,5,10, has replicated storeNum value : x.

Line #2,3, has replicated storeNum value : y.

第一个问题的简单的处理思路是:读取到一行后过滤空白符,再判断改行的长度是否为零。

第二个问题的有两个思路:

方法1:将各行读到HashSet中,由于HashSet是集合其本身不会被排序,所以可将HashSet排序(HashSet.OrderBy(Comparer))的副本保存到List中再做后序处理。

方法2:由于HashSet本身不会被排序(但是副本可以被排序),所以直接考虑用List。

这两个方法都会将原始的Input textfile中的行被排序,最后提示错误信息将和原始Input textfile不一致,解决这个问题的一个处理办法是:

将原始的Input textfile加上行号,这样即使被排序后,仍然可以知道这行在原始的Input textfile是第几行。

完整的实现如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.IO;
  6
  7 namespace ValidReplicatedLineVer3
  8 {
  9     class Program
 10     {
 11         static void Main(string[] args)
 12         {
 13             string filePath = @"E:\inputfile.txt";
 14             StreamReader sr = new StreamReader(filePath);
 15
 16             List<Line> list = new List<Line>();
 17             int num = 1;
 18
 19
 20             while (!sr.EndOfStream)
 21             {
 22                 string strTemp =  sr.ReadLine();
 23                 if (strTemp.Trim().Length == 0)
 24                 {
 25                     continue;
 26                 }
 27
 28                 string[] strArr = strTemp.Split(new char[] { ‘,‘ });
 29                 Line line = new Line();
 30                 line.lineNum = num++;
 31                 line.storeNum = strArr[0];
 32                 line.mosrName = strArr[1];
 33                 line.mosrNum = strArr[2];
 34
 35                 list.Add(line);
 36             }
 37             sr.Close();
 38
 39             list = list.OrderBy(x => x.storeNum).ToList();
 40
 41             foreach (Line l in list)
 42             {
 43                 StringBuilder sb1 = new StringBuilder();
 44                 sb1.AppendLine(Convert.ToString(l.lineNum) + ‘,‘ + l.storeNum + ‘,‘ + l.mosrName + ‘,‘ + l.mosrNum);
 45                 Console.Write(sb1);
 46             }
 47
 48             StringBuilder sb = new StringBuilder();
 49             sb = ValidReplicatedLines(list);
 50             Console.WriteLine(sb);
 51
 52         }
 53
 54         static StringBuilder ValidReplicatedLines(List<Line> list )
 55         {
 56             bool isFirst = true;
 57             string storeNum = null;
 58             StringBuilder sb = new StringBuilder();
 59             StringBuilder sbRet = new StringBuilder();
 60             for (int i = 0; i < list.Count - 1; i++)
 61             {
 62                 if ((list[i].storeNum == list[i + 1].storeNum) && ((i + 1) != list.Count))
 63                 {
 64                     if (isFirst)
 65                     {
 66                         sb.Append("Line #" + Convert.ToString(list[i].lineNum) + "," + Convert.ToString(list[i + 1].lineNum) + ",");
 67                         isFirst = false;
 68                         storeNum = list[i].storeNum;
 69                     }
 70                     else
 71                     {
 72                         sb.Append(Convert.ToString(list[i + 1].lineNum) + ‘,‘);
 73                     }
 74                 }
 75                 else
 76                 {
 77                     if (sb.ToString().Trim().Length != 0)
 78                     {
 79                         sb.Append(" replicated value: " + storeNum);
 80                         isFirst = true;
 81                         sbRet.AppendLine(sb.ToString());
 82                         sb.Remove(0, sb.Length);
 83                     }
 84                 }
 85             }
 86             if (sb.ToString().Trim().Length != 0)
 87             {
 88                 sb.Append("replicated value: " + storeNum);
 89                 sbRet.AppendLine(sb.ToString());
 90             }
 91
 92             return sbRet;
 93         }
 94
 95         public class Line
 96         {
 97             public int lineNum;
 98             public string storeNum;
 99             public string mosrName;
100             public string mosrNum;
101         }
102     }
103 }

HashSet/List 排序

时间: 2024-11-05 23:22:14

HashSet/List 排序的相关文章

HashSet的排序

import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.TreeSet; import org.junit.Test; public class TestHashSet { @Test public void sortHashSet() { HashSet<Integer> va = new HashSe

【HashSet】排序

利用TreeSet的排序: HashSet hs = new HashSet(); TreeSet ts = new TreeSet(hs); ts.comparator(); System.out.println(ts); 原文地址:https://www.cnblogs.com/zhuii/p/11751289.html

排序及重复元素去重的说明,TreeSet,HashSet

先看下面一段代码: package 类集; import java.util.Set; import java.util.TreeSet; class Person{ private String name ; private int age ; public Person(String name,int age){ this.name = name ; this.age = age ; } public String gtoString(){ return "姓名:" + this.

java集合List、Set、Map总结 + HashMap/Hashtable区别

List:(有序,可以重复)通过下标索引 ----ArrayList  可变数组,随机查找 ----LinkedList    链表,任何位置插入删除快 ----Vector    效率比arraylist低,但是可以用于多线程同步 Set:(无序,不可以重复)set最多有一个null元素,因为不可以重复 ----HashSet    没有排序,不重复(顺序随机) ----LinkedHashSet    按插入排序,不重复(按插入顺序) ----TreeSet    实现Comparable接

第七章 集合

1 /***************** 2 ***第七章 集合 3 *******知识点: 4 **************1.Collection和Iterator接口 5 ******************1.1 Collection接口简介 6 ******************1.2 Iterator接口简介 7 ******************1.3 Map接口简介 8 **************2.Set接口 9 ******************2.1 HashSet

java集合: List、Set、Map总结 + HashMap/Hashtable 差别

List:(有序,能够反复)通过下标索引 ----ArrayList  可变数组,随机查找 ----LinkedList    链表,不论什么位置插入删除快 ----Vector    效率比arraylist低.可是能够用于多线程同步 Set:(无序,不能够反复)set最多有一个null元素.由于不能够反复 ----HashSet    没有排序,不反复(顺序随机) ----LinkedHashSet    按插入排序.不反复(按插入顺序) ----TreeSet    实现Comparabl

java的集合类有哪些他们之间的关系有什么区别

Java API中所用的集合类,都是实现了Collection接口,他的一个类继承结构如下: Collection<--List<--Vector    数组实现 查询快.增删慢 Collection<--List<--ArrayList  数组实现 查询快.增删慢Collection<--List<--LinkedList  链表结构 查询慢.增删快Collection<--Set<--HashSet 自定义排序 对对象实现Comparable 重写com

List、Set、Map下各类型的对比

1.List和Set: List: 元素有放入顺序,元素可重复,查找效率高,插入删除效率低: Set: 元素无放入顺序,元素不可重复,(元素虽然无顺序,但元素在Set中的位置是由该元素的HashCode决定的,其位置其实是固定的),检索效率低,删除和插入效率高. 2.Arraylist.LinkedList和Vector: Arraylist查询操作效率比LinkedList高: 插入和删除操作效率Arraylist比LinkedList低: Vector是线程安全的(线程同步). 3.Hash

Java之------集合

集合 一.集合的概念 书面解释:集合是包含多个对象的简单对象,所包含的对象称为元素.集合里面可以包含任意多个对象,数量可以变化:同时对对象的类型也没有限制,也就是说集合里面的所有对象的类型可以相同,也可以不同.集合:数量不限.类型不限:数组:定长.类型单一. 个人理解:集合是数组的一种扩展,集合里面可以存放多种数据类型和对象,同时集合可自由扩充,也就是自由添加元素,而数组不能,这一点就远比数组强大.还可以借助数学中的集合来理解集合,集合中的元素不能重复. 二.数据存储结构分类 数组是顺序存储方式