我有一个列1列和100行各有一个数字 每行的数字可能不是唯一的 我需要输出根据其排名排序的唯一数字列表,如果其重复次数更多则更少。排名最低的数字,即1位于顶部
现在我正在计划如何解决这个问题
首先我要定义一个结构数组就像这样
struct abc[100]
{
int number
int occurrence = 1;
}
现在我想查看每一行的列表,并检查数字是否存在于结构数组中。如果它不是我想将数字存储在abc [row] .number中,但是如果数字存在于结构数组中,我想增加该特定记录的出现。
最后我会得到一个结构数组,其中包含每个唯一的数字和它们作为记录一起出现的时间。
这种编程风格是一种好方法吗?定义结构并通过它们看起来对我来说是一项繁琐的工作,你能建议我一个更好的方法吗?我是一名初学程序员,请随时给我任何建议
答案 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
。我正在返回SortedMap
(TreeMap
实现),因此该函数以复杂度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)
你的方式可行,一些替代方案是: