Java 查找和排序唯一的数字,有更好的方法吗?
我有一个列表1列和100行,每行都有一个数字 每行上的数字可能不是唯一的 我需要输出根据排名排序的数字的唯一列表,如果重复次数较多,则该列表会较少。排名最低的数字,即1位于顶部 下面是我计划如何解决这个问题 首先,我想定义一个如下的结构数组Java 查找和排序唯一的数字,有更好的方法吗?,java,algorithm,excel,Java,Algorithm,Excel,我有一个列表1列和100行,每行都有一个数字 每行上的数字可能不是唯一的 我需要输出根据排名排序的数字的唯一列表,如果重复次数较多,则该列表会较少。排名最低的数字,即1位于顶部 下面是我计划如何解决这个问题 首先,我想定义一个如下的结构数组 struct abc[100] { int number int occurrence = 1; } 现在,我想检查每一行的列表,并检查该数字是否存在于结构数组中。如果不是,我想将该数字存储在abc[row].number中。但是,如果该数字存在于结构数组
struct abc[100]
{
int number
int occurrence = 1;
}
现在,我想检查每一行的列表,并检查该数字是否存在于结构数组中。如果不是,我想将该数字存储在abc[row].number中。但是,如果该数字存在于结构数组中,我想增加该特定记录的出现次数
最后,我将得到一个结构数组,其中填充了每个唯一的数字和它作为记录一起出现的时间数
这种编程风格是一种好方法吗?对我来说,定义结构并在其中移动是一项乏味的工作。你能给我一个更好的建议吗?我是一名初级程序员,请随时给我一些建议您可以使用
哈希表
实现类似的功能,这样可以避免定义任何类型的结构,并使代码更整洁。哈希表的第一个输入是您正在跟踪的数字,第二个输入是它的出现次数。取决于您是否需要非常快的更新速度。如果是这样,您可能需要考虑保持元素按<代码>编号<代码>排序,并使用二进制搜索来查找该数字。这将把时间复杂度从O(n)降低到O(logn)
然后,在插入所有数字后,您可以按发生次数
(或发生次数
)进行排序,以便对它们进行正确排序,或者如果您希望继续插入原始数字,只需创建一个按发生次数排序的新列表。这是假设写操作比读操作更频繁(通常用于这种行为)
但在你的例子中,速度对于100个元素来说可能并不重要。最大迭代次数为100次(对于线性搜索)和7次(对于二进制搜索)之间存在差异
或者(这可能是最好的主意),使用Java已经提供的映射数据结构之一。你应该阅读并记住以下内容:-)
您可以使用
哈希表
,而不必担心100个元素的限制。您的代码大小将更小,因为Sun已经完成了使其工作的艰苦工作。您的方法将起作用,一些替代方法将是:
下面是一个返回项目频率映射的示例。该方法是通用的,因此适用于任何类型的项,而不仅仅是
Integer
。我返回一个SortedMap
(TreeMap
实现),因此函数运行的复杂性为O(n logn)。但是,我可以选择HashMap
实现,将复杂性降低到O(n)(因为HashMap
的插入性能是O(1))
import java.util.*;
公共班机{
公共静态void main(字符串[]args){
列表l=新的LinkedList();
l、 增加(5);
l、 增加(10);
l、 增加(2);
l、 增加(5);
l、 增加(20);
系统错误打印项次(频率(l));
}
私有静态分类映射频率(收集可以将ADO与Excel结合使用
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
我建议对问题使用一个真正描述问题的标题,而不是一般的标题。我还建议以更清晰的方式重新设置问题的格式,注意预览窗格,因为我猜它的当前格式不是预期的格式。就像那样,我甚至无法理解您试图实现的目标听起来像是你在发明数据透视表(内置于Excel中)+1但我想补充一点,如果你应该尽可能使用HashMap而不是Hashtable。唯一的功能区别是HashMap是不同步的,并且允许空值。我认为它已经在1.2或其他版本出现了。很好的一点,感谢你补充,我的Java有点生锈(这些天我大部分时间都在C上…)
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