Java - 计算数组中的数字

时间:2013-10-31 11:37:50

标签: java

我写了一个存储一些值的java编程:

public class array05 {
    public static void main(String[] args) {

        //placement of value
        int arryNum[] = {2,3,4,5,4,4,3};

        //placement of index, to start at 0
        for(int counter=0;counter<arryNum.length;counter++){
            System.out.println(counter + ":" + arryNum[counter]);
        }
    }   
}

生成这样的输出:
0:2
1:3
2:4
3:5个
4:4个
5:4个
6:3

现在我需要计算此输出#1中的数字。 输出#2应为:

1:0
2:1
3:2
4:3
5:1

这意味着它计算一个2,两个3,三个4,只有一个5。

我不知道如何编写输出2的代码。 这里需要二进制搜索吗?

任何人都能发光吗?

9 个答案:

答案 0 :(得分:4)

我建议你使用Map

  • 如果其中不存在数字,请添加为1的数字。
  • 如果该号码存在,请将其值加1。

然后您将地图打印为keyvalue

例如,对于您的数组{2,3,4,5,4,4,3},这将按如下方式工作:

地图是否包含密钥2?不,添加值1.(345相同)
地图是否包含4?是!将1添加到其值。现在 4的为2 ...

答案 1 :(得分:3)

这是解决此问题的方法:

import java.util.Arrays;

public class array05 {
    public static void main(String[] args) {
        //placement of value
        int arryNum[] = {2,3,4,5,4,4,3};

        // Sort the array so counting same objects is easy
        Arrays.sort(arryNum);

        int index = 0;  // The current index
        int curnum;     // The current number
        int count;      // The count of this number
        while (index < arryNum.length) {
            // Obtain the current number
            curnum = arryNum[index];

            // Reset the counter
            count = 0;

            // "while the index is smaller than the amount of items
            // and the current number is equal to the number in the current index,
            // increase the index position and the counter by 1"
            for (; index < arryNum.length && curnum == arryNum[index]; index ++, count++);

            // count should contain the appropriate amount of the current
            // number now
            System.out.println(curnum + ":" + count);
        }
    }   
}

人们使用Map发布了很好的解决方案,所以我想我会提供一个总是有效的解决方案(不仅仅是针对当前值),而不使用Map

答案 2 :(得分:3)

If you don't want to use Map, this is how you would do it with Arrays only(if you have numbers from 1 to 9 only)

Integer[] countArray = new Integer[10]

// Firstly Initialize all elements of countArray to zero
// Then
for(i=0;i<arryNum.length();i++){

int j = arryNum[i];
countArray[j]++;

}

此countArray在第一个位置的数字为0,在第二个位置的数量为1,依此类推

答案 3 :(得分:3)

如果你期望你的数组值在1-5之间(我假设这是你预期的输出)

int arryNum[] = { 2, 3, 4, 5, 4, 4, 3 };
int[] counter = new int[] { 0, 0, 0, 0, 0 };
for (int i = 0; i < arryNum.length; i++) {
    counter[arryNum[i] - 1]++;
}

for (int i = 0; i < counter.length; i++)
    System.out.println((i + 1) + ":" + counter[i]);

答案 4 :(得分:2)

这样的事情:

//numbers to count
int arryNum[] = {2,3,4,5,4,4,3};

//map to store results in
Map<Integer, Integer> counts = new HashMap<Integer, Integer>();

//Do the counting
for (int i : arryNum) {
   if (counts.containsKey(i) {
      counts.put(i, counts.get(i)+1);
   } else {
      counts.put(i, 1);
   }
}

//Output the results
for (int i : counts.keySet()) {
   System.out.println(i+":"+counts.get(i));
}

答案 5 :(得分:2)

使用Map存储计数值:

import java.util.HashMap;
import java.util.Map;

class array05{
  public static void main(String[] args){
      // Container for count values
      Map <Integer, Integer> result = new HashMap<Integer, Integer>();
      int arryNum[] = {2,3,4,5,4,4,3};
      for(int i: arryNum){ //foreach more correct in this case
            if (result.containsKey(i)) result.put(i, result.get(i)+1);
            else result.put(i, 1);
        }
        for (int i: result.keySet()) System.out.println(i + ":" + result.get(i));
  }
}

结果如下:

2:1
3:2
4:3
5:1

答案 6 :(得分:1)

一种方法是使用地图。当您读取每个数字上的第一个数组时,检查它是否存在于地图中,如果确实存在,则只增加分配给数字(键)的值,如果没有,则在地图中创建一个值为&#34; 1&的新键#34;

查看http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

答案 7 :(得分:1)

您也可以尝试这种方式

 int arrayNum[] = {2,3,4,5,4,4,3};
    Map<Integer,Integer> valMap=new HashMap<>();
    for(int i:arrayNum){ // jdk version should >1.7
        Integer val=valMap.get(i);
        if(val==null){
            val=0;
        }
        valMap.put(i,val+1);
    }
    Arrays.sort(arrayNum);
    for(int i=0;i< arrayNum[arrayNum.length-1];i++){
        System.out.println(i+1+" : "+((valMap.get(i+1)==null) ? 0:valMap.get(i+1)));
    }

Out put

    1 : 0
    2 : 1
    3 : 2
    4 : 3
    5 : 1

但是以下方式更好

    int arrayNum[] = {2,3,4,5,4,4,3};
    Arrays.sort(arrayNum);
    int countArray[]=new int[arrayNum[arrayNum.length-1]+1];
    for(int i:arrayNum){
       countArray[i]= countArray[i]+1;
    }
    for(int i=1;i<countArray.length;i++){
        System.out.println(i+" : "+countArray[i]);
    }

Out put

   1 : 0
   2 : 1
   3 : 2
   4 : 3
   5 : 1

答案 8 :(得分:0)

我更喜欢这样的通用解决方案:

public static <T> Map<T, Integer> toCountMap(List<T> itemsToCount) {
    Map<T, Integer> countMap = new HashMap<>();

    for (T item : itemsToCount) {
        countMap.putIfAbsent(item, 0);
        countMap.put(item, countMap.get(item) + 1);
    }

    return countMap;
}