查找和排序唯一数字,有更好的方法吗?

时间:2009-10-27 11:20:37

标签: java algorithm excel

我有一个列1列和100行各有一个数字 每行的数字可能不是唯一的 我需要输出根据其排名排序的唯一数字列表,如果其重复次数更多则更少。排名最低的数字,即1位于顶部

现在我正在计划如何解决这个问题

首先我要定义一个结构数组就像这样

struct abc[100]
{
int number
int occurrence = 1;
}

现在我想查看每一行的列表,并检查数字是否存在于结构数组中。如果它不是我想将数字存储在abc [row] .number中,但是如果数字存在于结构数组中,我想增加该特定记录的出现。

最后我会得到一个结构数组,其中包含每个唯一的数字和它们作为记录一起出现的时间。

这种编程风格是一种好方法吗?定义结构并通过它们看起来对我来说是一项繁琐的工作,你能建议我一个更好的方法吗?我是一名初学程序员,请随时给我任何建议

5 个答案:

答案 0 :(得分:2)

您可以使用Hashtable<Integer, Integer>实现类似的功能,这样可以避免定义任何类型的结构并使代码更整洁。 Hashtable的第一个输入是您正在跟踪的数字,第二个输入是它的出现次数。

答案 1 :(得分:0)

取决于您是否需要以惊人的速度进行更新。如果是这样,您可能需要考虑保持元素按number排序并使用二进制搜索来找到该数字。这将减少从O(n)到O(log n)的时间复杂度。

然后,一旦插入了所有数字,您可以按occurance(或occurrence)排序以对其进行正确排名,或者只是创建一个按发生排序的新列表(如果要继续插入)原本的。这假设写操作比读操作更频繁(通常用于此类行为)。

但在你的情况下,速度对于100个元素来说无关紧要。差异在于最多100次迭代(对于线性搜索)和7次迭代(对于二进制搜索)。

或者(这可能是最好的主意),使用Java已经提供的映射数据结构之一。你应该阅读并记住这个link: - )

您可以使用HashTable<Integer,Integer>而不用担心100元素限制。由于Sun已经完成了硬盘工作,所以代码大小会变小。

答案 2 :(得分:0)

这是一个返回项目频率Map的示例。该方法是通用的,因此适用于任何类型的项目,而不仅仅是Integer。我正在返回SortedMapTreeMap实现),因此该函数以复杂度O(n log n)运行。但是,我本可以选择HashMap实现,将复杂度降低到O(n)(因为HashMap的插入性能为O(1))。

import java.util.*;

public class Main {
  public static void main(String[] args) {
    List<Integer> l = new LinkedList<Integer>();
    l.add(5);
 l.add(10);
 l.add(2);
 l.add(5);
 l.add(20);

 System.err.println(freq(l));
  }

  private static <T> SortedMap<T, Integer> freq(Collection<? extends T> c) {
 SortedMap<T, Integer> ret = new TreeMap<T, Integer>();

 for (T t : c) {
     Integer fq = ret.get(t);
     ret.put(t, fq == null ? 1 : fq + 1);
 }

 return ret;
  }    
}

答案 3 :(得分:0)

可以在Excel中使用ADO。

Dim cn As Object
Dim rs As Object

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT Count(F1)  AS CountF1, F1 FROM [Sheet1$] GROUP BY F1 ORDER BY Count(F1) DESC"

rs.Open strSQL, cn

Sheets("Sheet2").Cells(2, 1).CopyFromRecordset rs

答案 4 :(得分:-1)

你的方式可行,一些替代方案是:

  1. 将数据加载到数据库中,并使用SQL返回排名,分组的列表。
  2. 使用内置的Java对象,如A S所说。
  3. 如果你使用的是.net,你可以使用Linq。