2009-10-27 91 views
-2

我有一个列表1列和每一个号码 100行上的每一行的数量可能不唯一 我需要输出根据它们的等级,这是排序号码的唯一列表更少,如果其重复数更多。至少排名第一即1是顶部查找和排序唯一号码,有没有更好的方法?

现在这里是我打算如何解决这个问题

首先我要定义结构的阵列会是这样

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

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

在端我会得到充满的时间每个唯一号码和号码一起发生作为记录的结构的阵列。

是这种编程风格的好办法?定义结构并穿过它们看起来是一件乏味的工作,你能否告诉我一个更好的方法?我是一个初学者程序员,请随时给我任何种类的建议

+8

我会建议使用标题的问题,实际上描述的问题,而不是通用的东西。我还建议以更清晰的方式重新格式化您的问题,注意预览窗格,因为我猜测它的当前格式不是它的打算方式。就像我甚至无法理解你想要完成什么...... – 2009-10-27 11:28:05

+0

听起来像你正在重新发明数据透视表(它是内置于Excel) – barrowc 2009-10-28 03:40:34

回答

0

这是一个返回项目频率图的例子。该方法是通用的,因此适用于任何类型的物品,而不仅仅是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; 
    }  
} 
2

您可能可以实现类似的使用Hashtable<Integer, Integer>,这将避免需要定义任何类型的结构,并使您的代码有点整齐。哈希表的第一个输入是您正在跟踪的数字,第二个输入是它的出现次数。

+0

+1但是就像添加如果你应该使用HashMap尽可能不要使用Hashtable。唯一的功能区别是HashMap是不同步的,并且允许空值。我认为它自1.2以来就已经存在了。 – NickDK 2009-10-27 12:27:25

+0

不错的一点,谢谢你补充一点,我的Java有点生疏(现在大部分时间都花在C#上面) – 2009-10-27 13:51:31

0

取决于你是否需要更新快如闪电的速度。如果是这样,您可能需要考虑保留按number排序的元素,并使用二进制搜索来查找该号码。这将减少从O(n)到O(log n)的时间复杂度。

然后,一旦插入了所有数字,您可以按occurance(或occurrence)排序以正确排列它们,或者如果要继续插入原始内容,只需创建按发生次数排序的新列表。这是假设写操作将比读操作更频繁(这种行为通常)。

但它可能是,你的情况,这个速度并不重要的100个元素。区别在于最多100次迭代(用于线性搜索)和7次迭代(用于二进制搜索)。

或者(这可能是最好的办法),已使用Java提供的映射数据结构中的一个。您应该阅读并记住这一点:-)

您可以使用HashTable<Integer,Integer>而不用担心100个元素的限制。 Tou're代码的大小会比较小,因为Sun已经完成了硬码的工作。

-1

你的方式将工作,一些替代方案是:

  1. 将数据加载到数据库中,并使用SQL返回排名,分组名单。按照S的说法,使用内建的Java对象。
  2. 如果您使用.net,您可以使用Linq。
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 
相关问题