读书人

c#处理文本文件的有关问题字符串数组

发布时间: 2011-12-18 22:54:38 作者: rapoo

c#处理文本文件的问题,字符串数组按指定内容排序!50分
有一文本文件,内容如下:
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "方法豆腐干" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"324234" 1 "飞过豆腐干的" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfd234sf" " dsf42sdaf" " sdfsd " " fds fsdf"
"dsfd242sf" " dsfsd234af" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "发火点法" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfds234f" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "发火点法" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfds234f" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
==========================================================================================================

现在要求按 第二对双引号内的内容 如:"看见飞过海扩大计划发"进行排序;
结果如下:
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfd242sf" " dsfsd234af" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfd242sf" " dsfsd234af" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "看见飞过海扩大计划发" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"324234" 1 "发火点法" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"


"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfds234f" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "发火点法" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfds234f" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "方法豆腐干" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfds324f" " dsfs423daf" " sdfsd " " fds fsdf"
"dsfdsf234" " dsf34sdaf" " sdfsd " " fds fsdf"
"dsfds234f" " dsfs234daf" " sdfsd " " fds fsdf"
"dsfd234sf" " dsf42sdaf" " sdfsd " " fds fsdf"
"dsfd242sf" " dsfsd234af" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
"324234" 1 "飞过豆腐干的" "深刻酱豆腐好看上计划反抗十分棵十分十分" "" ""
"dsfd234sf" " dsf42sdaf" " sdfsd " " fds fsdf"
"dsfd242sf" " dsfsd234af" " sdfsd " " fds fsdf"
"dsfd234sf" " dsfs234daf" " sdfsd " " fds fsdf"
==============================================================================================
如果觉得分数不够,我还可以追加,希望高手帮忙!



[解决办法]
见两个临时StringBuilder sbOrdered和sbTmp,逐行取进行比较,如果要是 "看见飞过海扩大计划发" 的话直接Append到sbOrdered,如果不是则Append到sbTmp,最后把sbTmp Append到sbOrdered。
排序完成
[解决办法]
用到委托


下面的示例将说明委托的用途。我们要编写一个类BubbleSorter,它执行一个静态方法Sort(),这个方法的第一个参数是一个对象数组,把该数组按照升序重新排列。换言之,假定传递的是int数组:{0, 5, 6, 2, 1},则返回的结果应是{0, 1, 2, 5, 6}。

冒泡排序算法非常著名,是一种排序的简单方法。它最适合于一小组数字,因为对于大量的数字(超过10个),还有更高效的算法。冒泡排序算法重复遍历数组,比较每一对数字,按照需要交换它们的位置,把最大的数字逐步移动到数组的最后。对于给int排序,进行冒泡排序的方法如下所示:

// Note that this isn~t part of the sample

for (int i = 0; i < sortArray.Length; i++)

{

for (int j = i + 1; j < sortArray.Length; j++)

{

if (sortArray[j] < sortArray[i]) // problem with this test

{

int temp = sortArray[i]; // swap ith and jth entries

sortArray[i] = sortArray[j];

sortArray[j] = temp;

}

}

}

它非常适合于int,但我们希望Sort()方法可以给任何对象排序。换言之,如果某段客户机代码包含Currency结构数组或其他类和结构,就需要对该数组排序。这样,上面代码中的if(sortArray[j] < sortArray[i])就有问题了,因为它需要比较数组中的两个对象,看看哪一个更大。可以对int进行这样的比较,但如何对直到运行期间才知道或确定的新类进行比较?答案是客户机代码知道类在委托中传递的是什么方法,封装这个方法就可以进行比较。

定义如下的委托:

delegate bool CompareOp(object lhs, object rhs);

给Sort方法指定下述签名:

static public void Sort(object [] sortArray, CompareOp gtMethod)

这个方法的文档说明强调,gtMethod必须表示一个静态方法,该方法带有两个参数,如果第二个参数的值“大于”第一个参数(换言之,它应放在数组中靠后的位置),就返回true。

注意:

这里使用的是委托,但也可以使用接口来解决这个问题。.NET提供的IComparer接口就用于此目的。但是这里使用委托是因为这种问题本身要求使用委托。

设置完毕后,下面定义类BubbleSorter:

class BubbleSorter

{

static public void Sort(object [] sortArray, CompareOp gtMethod)

{

for (int i=0 ; i

{

for (int j=i+1 ; j

{

if (gtMethod(sortArray[j], sortArray[i]))

{

object temp = sortArray[i];

sortArray[i] = sortArray[j];

sortArray[j] = temp;

}

}

}

}


}

为了使用这个类,需要定义一些其他类,建立要排序的数组。在本例中,假定Mortimer Phones移动电话公司有一个员工列表,要对照他们的薪水进行排序。每个员工分别由类的一个实例Employee表示,如下所示:

class Employee

{

private string name;

private decimal salary;



public Employee(string name, decimal salary)

{

this.name = name;

this.salary = salary;

}



public override string ToString()

{

return string.Format(name + ", {0:C}", salary);

}



public static bool RhsIsGreater(object lhs, object rhs)

{

Employee empLhs = (Employee) lhs;

Employee empRhs = (Employee) rhs;

return (empRhs.salary > empLhs.salary) ? true : false;

}

}

注意,为了匹配CompareOp委托的签名,在这个类中必须定义RhsIsGreater,它的参数是两个对象引用,而不是Employee引用。必须把这些参数的数据类型转换为Employee引用,才能进行比较。

下面编写一些客户机代码,完成排序:

using System;



namespace Wrox.ProCSharp.AdvancedCSharp

{

delegate bool CompareOp(object lhs, object rhs);



class MainEntryPoint

{

static void Main()

{

Employee [] employees =

{

new Employee("Bugs Bunny", 20000),

new Employee("Elmer Fudd ", 10000),

new Employee("Daffy Duck", 25000),

new Employee("Wiley Coyote", (decimal)1000000.38),

new Employee("Foghorn Leghorn", 23000),

new Employee("RoadRunner~", 50000)};

CompareOp employeeCompareOp = new CompareOp(Employee.RhsIsGreater);

BubbleSorter.Sort(employees, employeeCompareOp);



for (int i=0 ; i

Console.WriteLine(employees[i].ToString());

}

}

运行这段代码,正确显示按照薪水排列的Employee,如下所示:

BubbleSorter

Elmer Fudd, $10,000.00

Bugs Bunny, $20,000.00

Foghorn Leghorn, $23,000.00

Daffy Duck, $25,000.00

RoadRunner, $50,000.00

Wiley Coyote, $1,000,000.38
[解决办法]
首先要把这个文本文件读到List里面
然后排序这个List
然后把List写会文件

读写文件自己搞定吧
读的时候每行按照空格去Split成一个字符串数组
至于排序实现一下ICompare接口就可以了

ICompare如下
using System.Collections;
using System;
using System.Collections.Generic;

namespace testApplication1
{
/// <summary>
/// IntCompare
/// </summary>
public class ListCompare : IComparer<string[]>
{
public ListCompare()
{
}

#region IComparer<string[]>

public int Compare(string[] x, string[] y)
{
string temp1 = x[2];
string temp2 = y[2];
return temp1.CompareTo(temp2);//如果倒序颠倒位置~~~~这里可以自定义需要排序的字段
}

#endregion
}
}


调用方法如下
List<string[]> test = new List<string[]>();
test.Add(new string[] { "324234", "1", "666", "111" });
test.Add(new string[] { "324234", "1", "000", "111" });
test.Add(new string[] { "324234", "1", "222", "111" });
test.Add(new string[] { "324234", "1", "444", "111" });
test.Sort(new ListCompare());
foreach (string[] temp in test)
{
Console.WriteLine(temp[2]);
}
[解决办法]
第二对双引号内的内容全是中文字符吗?

如果是,他们之间是按照中文拼音的第一个字母的顺序排列,还是倒序?

又或者不按拼音字母排列,是按原来从上到下的顺序依次取完?



-----------------------------------

比如说原数据是:

张三
李四
张三
王五
李四

排列之后应该是哪一种?

(1)张三 (2)李四 (3)张三
张三 李四 张三
李四 王五 王五
李四 张三 李四
王五 张三 李四

读书人网 >C#

热点推荐