黑马程序员技术交流社区
标题:
关于数组的练习分享和问题
[打印本页]
作者:
邓明
时间:
2014-6-5 15:24
标题:
关于数组的练习分享和问题
本帖最后由 邓明 于 2014-6-5 15:27 编辑
我在学习数组的时候也在参考其他相关书籍同步在学,其中有关于多维数组的部分我遇到了这样的一个练习,与大家分享,并且有几个问题想请教下:
题目的大意是这样的:有几本图书,我们知道书名、价格和作者,需要编写段代码按照分别按照书名、价格、作者姓名进行排序,并显示出排序结果。
我的思路是这样的:构建多维数组,然后根据不同的排序方式调用不同的方法来进行排序,具体代码如下:
Book类:
<p>
<p class="blockcode">class Book
{
//图书的属性
public string strName;//书名
public double dblPrice;//价格
public string strAuthor;//作者</p><p> </p><p> public Book(string _strName, double _dblPrice, string _strAuthor)
{
this.strName = _strName;
this.dblPrice = _dblPrice;
this.strAuthor = _strAuthor;
}</p></p>
复制代码
BookList类:
<p><p> class BookList
{
/// <summary>
/// 按照书名显示一个图书数组中的多本图书
/// </summary>
/// <param name="arrBooks">图书数组</param></p><p></p><p> public static void DisplayByName(Book[] arrBooks)
{
//获取图书数量,用于动态建立“书名”数组
int bookNumber = arrBooks.GetUpperBound(0) - arrBooks.GetLowerBound(0) + 1;</p><p></p><p> //用CreateInstance方法动态建立“书名”数组
int[] lengths = new int[] { bookNumber };
int[] lowerBounds = new int[] { 0 };
Array arrNames=Array.CreateInstance(Type.GetType("System.String"),lengths,lowerBounds);
//为“书名”赋值
for (int i = arrBooks.GetLowerBound(0); i <= arrBooks.GetUpperBound(0); i++)
{
arrNames.SetValue(arrBooks[i].strName, i);
}
//对于arrBooks数组针对书名arrNames关键字进行排序
Array.Sort(arrNames, arrBooks);
//对排序完成后的arrBooks数组将各个元素显示和输出
foreach (Book item in arrBooks)
{
Console.WriteLine("{0} {1} {2}", item.strName, item.dblPrice, item.strAuthor);
}
}
/// <summary>
/// 按照图书价格显示多本图书
/// </summary>
/// <param name="arrBooks">图书数组</param>
public static void DisplayByPrice(Book[] arrBooks)
{
//获取图书数量,用于动态建立“价格”数组
int bookNumber = arrBooks.GetUpperBound(0) - arrBooks.GetLowerBound(0) + 1;
//用CreateInstance方法动态建立“价格”数组
int[] lengths = new int[] { bookNumber };
int[] lowerBounds = new int[] { 0 };
Array arrPrice = Array.CreateInstance(Type.GetType("System.Double"), lengths, lowerBounds);
//为“价格”赋值
for (int i = arrBooks.GetLowerBound(0); i <= arrBooks.GetUpperBound(0); i++)
{
arrPrice.SetValue(arrBooks[i].dblPrice, i);
}
//对于arrBooks数组针对价格arrPrice关键字进行排序
Array.Sort(arrPrice, arrBooks);
//对排序完成后的arrBooks数组将各个元素显示和输出
foreach (Book item in arrBooks)
{
Console.WriteLine("{0} {1} {2}", item.strName, item.dblPrice, item.strAuthor);
}
}
/// <summary>
/// 按照图书作者显示多本图书
/// </summary>
/// <param name="arrBooks">图书数组</param>
public static void DisplayByAuthor(Book[] arrBooks)
{
//获取图书数量,用于动态建立“作者”数组
int bookNumber = arrBooks.GetUpperBound(0) - arrBooks.GetLowerBound(0) + 1;
//用CreateInstance方法动态建立“作者”数组
int[] lengths = new int[] { bookNumber };
int[] lowerBounds = new int[] { 0 };
Array arrAuthor = Array.CreateInstance(Type.GetType("System.String"), lengths, lowerBounds);
//为“作者”赋值
for (int i = arrBooks.GetLowerBound(0); i <= arrBooks.GetUpperBound(0); i++)
{
arrAuthor.SetValue(arrBooks[i].strAuthor, i);
}
//对于arrBooks数组针对作者arrAuthor关键字进行排序
Array.Sort(arrAuthor, arrBooks);
//对排序完成后的arrBooks数组将各个元素显示和输出
foreach (Book item in arrBooks)
{
Console.WriteLine("{0}{1}{2}", item.strName, item.dblPrice, item.strAuthor);
}
}
}</p></p>
复制代码
Main函数如下:
<p><p>
<p>class Program
{
static void Main(string[] args)
{
Book b1 = new Book("我的1949", 20, "吴");
Book b2 = new Book("神经是怎么炼成的", 16.83, "张");
Book b3 = new Book("上下五千年", 299.99, "Alex");
Book b4 = new Book("达芬奇密码", 40.99, "丹布朗");
Book b5 = new Book("新编汉语词典", 30.5, "编委会");</p><p> </p><p> Book[] myBook = new Book[] { b1, b2, b3, b4, b5 };</p><p> </p><p> Console.WriteLine(">>请输入排序规则:1-按书名,2-按价格,3-按作者");</p><p></p><p> int choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
BookList.DisplayByName(myBook);
break;
case 2:
BookList.DisplayByPrice(myBook);
break;
case 3:
BookList.DisplayByAuthor(myBook);
break;
default:
break;
}</p><p> Console.ReadKey(false);
}
}</p></p></p>
复制代码
测试的结果如下:
1.png
(21.61 KB, 下载次数: 4)
下载附件
2014-6-5 14:43 上传
2.png
(16.81 KB, 下载次数: 3)
下载附件
2014-6-5 14:43 上传
3.png
(20.91 KB, 下载次数: 3)
下载附件
2014-6-5 14:43 上传
经过实际测试,确实可以按照要求进行排序并且输出,但总体来看,我认为有以下几点收获:
1.BookList类稍显复杂,整个代码显得冗长,后来发现可以用Split进行分割,再进行排序的方法,缩减代码,这部分后续补充;
2.在这段代码中,使用了较多的方法,并且加入了类的使用,其中占大部分的篇幅仍然是对数组的使用,以及与数组相关的方法,提高了数组的熟练度,这是今天最大的收获;
3.验证了Array.Sort()方法的排序方式,默认是升序排列的,降序排列的方法还在研究中;
4.在使用CreateInstance方法创建数组时,第一个变量是Type.GetType("System.Double")还是Type.GetType("System.String")是要根据创建数组的类型而定的,如果是int型就应该是Type.GetType("System.Int"),char类型也有类似的格式;
5.在取长度时也是用多维数组维度的方式获取的,简单的方式可以是Array.Length,可以用此方法减少代码的行数。
同时发现的问题也有不少,先列举两个,请高手指点一下:
1.在BookList类中,有DisplayByName,DisplayByPrice,DisplayByAuthor三个方法,其代码是差不多的,但是一直没找到可以缩减为一个方法的办法,还请高手指点;
2.在实际测试中,Array.Sort方法是直接根据关键字将数组内的元素进行了排序,哪位可以解释一下这个方法的实际工作原理或者内部逻辑?
作者:
yllogininbh
时间:
2014-6-5 20:53
顶
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2