2010-11-20 32 views
1

问题是: 编写一个程序,将数据读入int类型的数组。有效的输入是从0到10.你的程序应该确定输入了多少个值。输出不同条目的列表以及该条目发生次数的计数。关于C#作业问题,请

我到目前为止有:

using System; 
using System.Collections; 
namespace ConsoleApplication25 
{ 
class Program 
{ 
    static void Main() 
    { 
     ArrayList list = new ArrayList(); 
     string inValue; 

     Console.WriteLine("Please enter a value from 0-10"); 
     Console.WriteLine("To end the program, type 11"); 
     for (int i = 0; i < 11; i++) 
     { 
      Console.Write("Enter Value:", i); 
      inValue = Console.ReadLine(); 
      i = int.Parse(inValue); 
      list.Add(i); 
      list.Remove(11); 
      list.Sort(); 
     } 
     int[] c = list.ToArray(typeof(int)) as int[]; 

     foreach (int value in c) 
     { 
      Console.WriteLine(value); 
     } 
     Console.WriteLine("There are {0} values.", list.Count); 

     } 
    } 
} 

当我被困在正在显示的每个值的计数。我已经尝试设置一个如果与一个柜台,并设置案件休息和不成功。我们还没有开始使用LINQ。任何建议或提示将不胜感激。

感谢,

杰森

+0

Ixnay在'ArrayList'。这是一个弃用的类(仅为向后兼容提供),现在已经被新的通用集合完全替代了6年。 – 2010-11-20 23:01:21

+0

@Ben福格特:没有,'ArrayList'类实际上没有过时。它实际上已经过时,但仍未标记为过时(出于某种原因)。 – Guffa 2010-11-20 23:07:59

+0

@Guffa:无论哪种方式,它不应该在新的代码中使用了,谁教它,应立即停用并送刷上自己的技能任何教授。 .NET 2.0和泛型是在2005年11月发布的(所以仅在五年前,并非如我所说的那样,但测试版在10个月前已公开可用,已足够接近六年),但仍然没有任何借口'ArrayList'。 – 2010-11-21 00:56:43

回答

3

使用Dictionary<int, int>到它多少次发生储值和计数。短例如:

Dictionary<int, int> values = new Dictionary<int, int>(); 
... 
Console.Write("Enter Value:", i); 
inValue = Console.ReadLine(); 
i = int.Parse(inValue); 
if(values.ContainsKey(i)) 
{ 
    values[i]++; 
} 
else 
{ 
    values.Add(i, 1); 
} 
... 
+2

对于这种特殊情况,数组将比'Dictionary'好得多(键是不可分割的且连续的)。 – 2010-11-20 22:59:39

+1

我认为,对于标记为家庭作业的问题,显示几乎完整的解决方案并不是最有用的事情...... – 2010-11-20 23:03:14

+0

这不是一个完整的解决方案,而是解决问题的方法之一。看看评论,你会发现还有其他(甚至更好)的解决方案,这个问题的作者不需要选择我的。 – derelict 2010-11-20 23:19:08

0

提示:

generic dictionaries的数据结构,将持有两个用于输入的数据,并且每个产生的数量。

3
  1. 从用户持续获得输入的方法是使用一个循环,而不是为环路在你改变所有的时间。代码应该是这样的:

    int i = 0; 
    while (i < 11) 
        get i, put it in the array 
    
  2. 没有理由进行排序数组列表,绝对没有理由每次你得到一个新的输入时间排序。

  3. 如果您的输入被限制为0..10,请设置一个11个元素的数组,然后重新输入您的输入项并添加到计数中。伪代码应该是这样的:

    foreach input 
        count[input]++ 
    

    然后你就会有结果中的每个计数细胞。

0

只是复述,你目前的做法是将所有输入的号码加入到一个列表,然后对列表进行排序,让你喜欢的东西1,2,2,3,4,4,4。然后你想找到列表中的所有独特的项目和他们的计数。

要做到这一点,你可以迭代这个数组和

  • 记住当前值your're阅读
  • 记得次数值出现至今

然后,当前值发生变化时,您将打印前一个值和您看过的次数。这一定会奏效,你应该能够以这种方式完成作业。

几个不相关的注意事项:

  • 这是更好地使用List<int>,而不是ArrayList,因为你并不需要将其转换为int[] - 你可以用列表操作和使用list[i]获得整数值超出它。
  • 你应该叫Sort只有一次你读所有的输入
  • 后使用for循环阅读的内容,您只能读取11(固定计数)项目
  • 而不是总是试图祛瘀值11,你只能打电话Add如果值不是11

正如其他人所提到的,你可以使用Dictionary<int, int>计数的项目数“当您去”,但是这是该办法的一个彻底的改变。我认为这是完成你开始做一个好主意......

0

你可以使用一个数组来代替存储计数的实际整数和使用数组的指数法为值0 - 10。然后,当你输出唯一值,你可以检查哪些索引没有count = 0;例如,数组[1]存储输入值1

0

一些技巧计数:

  • 不要使用ArrayList类,它实际上已经过时。如果要存储整数列表,请使用List<int>

  • 你的循环逻辑不能正常工作。如果输入值10,则在循环结束并退出时将增加到11。相反,你退出,如果值是11

  • 不要删除值11,你应该使用一个do {} while()循环,而不是避免增加值,如果是11

  • 如果您使用的方法进行排序该列表在循环之后执行,而不是一遍又一遍地排序。

  • 您可以保留整数对的列表以记录值和出现次数,也可以将所有值保留在列表中,对其进行排序,然后在显示结果时对发生次数进行计数。 A Dictionary<int, int>适合保存整数对的列表。

  • 由于有效值限制为0..10,您还可以使用一个包含11个项目的数组来计算出现次数。当您显示结果时,您会跳过计数为零的值。