2011-11-03 25 views
0

我有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); 

} 
+0

你能解释一下当你说方法不起作用时你的意思吗? –

+0

听起来像家庭作业..我会使用一个地图与数字作为关键,并出现的次数作为价值。 – Laf

+0

如果这是家庭作业,它需要被标记为这样。 – Thom

回答

0

所以,你需要做的第一件事就是选择一种数据结构,可以代表一个值,它有多少重复。 ,想到的第一件事是一个地图

Map<Integer,Integer> //会跟踪是关键,这是价值

那么,什么需要为您解析出你的阵列发生计数的整数(或无论你正在读取这个值的结构)就是这样做的地图检查:
myMap.contains(integerToCheck);

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

然后打印这些值,你会做以下几点:

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

感谢您的回复,这看起来不难做到。唯一的问题是Idk,如果我的老师会接受这种做法。我在最后张贴的方法是他给我们的方法,但我无法使它工作。 – TMan

+0

使用地图存储频率不是此问题的最佳解决方案。首先在可能的数字分布的一半中,Map将占用更多的内存,即一个int数组,第二个使用这种方法,你将错过频率为0的所有数字,第三个是添加额外的检查。更好的解决方案是使用int数组并简单地增加必要的索引。 –

+0

如果值的范围相当小,'int []'只适用于保存计数器。否则你的数组将会是'new int [Integer.MAX_VALUE];' –

1

岗前:如果您需要使用二叉树搜索 ,看来你上面的代码创建每一个新的树它正在寻找的元素。相反,您应该搜索一棵树,为每个要查找的元素添加/更新。

上一篇: 尽管@ 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()); 
} 
+0

如果他的教授可能会让他使用第三方库 – Woot4Moo

+0

,我会感到震惊,这取决于教授。我发现使用ListMultimap和Map没有区别,但它不是我的调用。 ;)但是,我更新了我的帖子以解决树解决方案。 –

+0

实际上,我也不是。 – Woot4Moo

0

我觉得你在正确的方向前进。

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

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

相关问题