如何查找重复的数字并显示该数字的频率

时间:2011-11-03 18:40:49

标签: java binary-tree

我有1000个数字,我制作了一个二叉树并对树进行排序。它打印0到100,其他899个数字是重复的。如何跟踪每个数字的频率。例如,数字28出现9次。以某种方式保持计数。我一直在使用一种方法,但Idk如果它接近或不接近。我会在最后发布这个方法。

   public class bigTree {
 int data; 
 int frequency;
 bigTree Left, Right;


public bigTree makeTree(int x) {
     bigTree p; 
     p = new bigTree();
     p.data = x;
     p.Left = null;
     p.Right = null;

     return p;
 }


 public void setLeft(bigTree t, int x) {

     if (t.Left != null) {
        // setLeft(t.Left, x);
         System.out.println("Error");
     }
     else {


         t.Left = makeTree(x);
     }

 }


 public void setRight(bigTree t, int x) {

     if (t.Right != null) {
         //setRight(t.Right, x);
         System.out.println("Error");
     } else {


         t.Right = makeTree(x);
     } 
 }

 public void insertLocation(bigTree tree, int v) {

    // if (tree.data == v) {

         //findDuplicate(v);
 //}

     if (v < tree.data) {
         if (tree.Left != null){
             insertLocation(tree.Left, v);
         }
         else {
             setLeft(tree, v);
         }
    }
     if (v > tree.data) {
        if (tree.Right != null){
            insertLocation(tree.Right, v);
        } else {
        setRight(tree, v);
        }
     }

    } 


    public void sort(bigTree t) {

     if (t.Left != null) {
         sort(t.Left);

     } 
    System.out.println(t.data + " freq = " + frequency);

     if (t.Right != null) {
         sort(t.Right);
     }

     }

 public void dealArray( String[] x) {
    int convert;

    bigTree tree = makeTree(Integer.parseInt(x[0]));

     for (int i = 1; i < x.length; i++){
         //convert = Integer.parseInt(x[i]);

         insertLocation(tree, Integer.parseInt(x[i]));
        findDuplicate(Integer.parseInt(x[i]));

     }  sort(tree);
 }

----我认为可行的方法,但不是----

         public void findDuplicate(int number) {
 bigTree tree, h, q;


 tree = makeTree(number);
    //while (//there are #'s in the list) { //1st while()

        h = tree;
        q = tree;

        while (number != h.data && q != null) { //2nd while()
            h = q; 

            if (number < h.data ) {
                q = q.Left;

            } else { 
                q = q.Right;
            }
        } //end of 2nd while()

        if (number == h.data) {
            //h.frequency++;
            System.out.println("Duplcate: " + number + "freq = " + h.frequency++); 

        } 
        else {
            if (number < h.data) {
                setLeft(h,number);
            }
            else {
                setRight(h, number);
            }

        } 
 //} // End of 1st while() 
        sort(h);

 }

3 个答案:

答案 0 :(得分:1)

<强> PREPOST: 如果您需要使用二叉树搜索,则上面的代码似乎为它正在查找的每个元素创建一个新树。相反,您应该只搜索一个树,为您要查找的每个元素添加/更新。

上一篇文章: 虽然@ Woot4Moo的答案会起作用,但是创建计数和递增会产生开销。我建议使用Guava的ListMultimap类来为您处理所有这些。 ListMultimap

ListMultimap<Integer, Integer> mymap;
for (Integer value : values){
    mymap.put(value, value);
}

Map<Integer, List<Integer>> asmap = mymap.asMap();
for (Entry<Integer, List<Integer>> entry : asmap.entrySet()){
    System.out.println(String.format("Value %d occurred %d times", entry.getKey(), entry.getValue().size());
}

答案 1 :(得分:0)

因此,您需要做的第一件事就是选择一个可以表示值的数据结构以及它具有的重复数量。首先想到的是地图

Map<Integer,Integer> //跟踪作为键的整数和作为值的计数

因此,当你解析数组(或者你从中读取这些值的任何结构)时需要发生的事情就是检查Map,如下所示:
myMap.contains(integerToCheck);

如果contains返回true,则需要增加myMap中存储的该键的值。否则,您需要插入使用integerToCheck的新密钥和新值1

然后要打印这些值,您将执行以下操作:

for(Map.Entry<Integer,Integer> entry: myMap.entrySet())  
{  
    System.out.println(entry.getKey + " : " + entry.getValue());
}

答案 2 :(得分:0)

我认为你朝着正确的方向前进。

1)您需要对元素进行排序。有很多方法可以做到这一点。 enter link description here

2)您需要找到重复的元素。这可以通过将第i个元素与i + 1个元素进行比较来完成。您可以将答案存储在地图中。