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

Java 查找和排序唯一的数字,有更好的方法吗?,java,algorithm,excel,Java,Algorithm,Excel,我有一个列表1列和100行,每行都有一个数字 每行上的数字可能不是唯一的 我需要输出根据排名排序的数字的唯一列表,如果重复次数较多,则该列表会较少。排名最低的数字,即1位于顶部 下面是我计划如何解决这个问题 首先,我想定义一个如下的结构数组 struct abc[100] { int number int occurrence = 1; } 现在,我想检查每一行的列表,并检查该数字是否存在于结构数组中。如果不是,我想将该数字存储在abc[row].number中。但是,如果该数字存在于结构数组

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

下面是我计划如何解决这个问题

首先,我想定义一个如下的结构数组

struct abc[100]
{
int number
int occurrence = 1;
}
现在,我想检查每一行的列表,并检查该数字是否存在于结构数组中。如果不是,我想将该数字存储在abc[row].number中。但是,如果该数字存在于结构数组中,我想增加该特定记录的出现次数

最后,我将得到一个结构数组,其中填充了每个唯一的数字和它作为记录一起出现的时间数


这种编程风格是一种好方法吗?对我来说,定义结构并在其中移动是一项乏味的工作。你能给我一个更好的建议吗?我是一名初级程序员,请随时给我一些建议

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

取决于您是否需要非常快的更新速度。如果是这样,您可能需要考虑保持元素按<代码>编号<代码>排序,并使用二进制搜索来查找该数字。这将把时间复杂度从O(n)降低到O(logn)

然后,在插入所有数字后,您可以按
发生次数
(或
发生次数
)进行排序,以便对它们进行正确排序,或者如果您希望继续插入原始数字,只需创建一个按发生次数排序的新列表。这是假设写操作比读操作更频繁(通常用于这种行为)

但在你的例子中,速度对于100个元素来说可能并不重要。最大迭代次数为100次(对于线性搜索)和7次(对于二进制搜索)之间存在差异

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


您可以使用
哈希表
,而不必担心100个元素的限制。您的代码大小将更小,因为Sun已经完成了使其工作的艰苦工作。

您的方法将起作用,一些替代方法将是:

  • 将数据加载到数据库中,并使用SQL返回已排序、已分组的列表
  • 如S所说,使用内置Java对象
  • 如果您使用的是.net,那么就可以使用Linq

  • 下面是一个返回项目频率映射的示例。该方法是通用的,因此适用于任何类型的项,而不仅仅是
    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