2009-10-27 18 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 
相關問題