2013-12-17 37 views
0

我有一个关于如何查找列表中出现次数的问题。就我而言,对于我的部分程序,我试图找出飓风类别1,2,3和4的出现次数并显示它们。我尝试使用for循环和if语句,但是当我运行它时,输出为零。我怎样才能解决这个问题?任何帮助将不胜感激。下面是我的程序的一个片段:如何查找List/ArrayList中的出现

Hurricanes2.java:

// category 1 occurrence 
    int i = 0; 
    int ii = 0; 
    int category1 = category.get(i); 
    for(int j = 0; j < category.size(); j++){ 
     if(category1 == 1){ 
      ii++; 
     } 
    } 
System.out.printf("%1s%10d%n", "Category 1 occurrence ~", ii); 

,当我跑得到这样的:

run: 
         Hurricanes 1980 - 2006 

Year   Hurricane   Category  Pressure(mb) Wind Speed (mph) 
____________________________________________________________________________________ 
1980    Allen     2     100     945 
1983    Alicia     2     100     962 
1984    Diana     2     100     949 
1985     Bob     1     65    1002 
1985    Danny     1     80     987 
1985    Elena     2     100     959 
1985    Gloria     1     90     942 
1985    Juan     1     75     971 
1985    Kate     1     85     967 
1986    Bonnie     1     75     990 
1986    Charley     1     65     990 
1987    Floyd     1     65     993 
1988   Florence     1     70     984 
1989    Chantal     1     70     986 
1989    Hugo     3     120     934 
1989    Jerry     1     75     983 
1991     Bob     1     90     962 
1992    Andrew     4     145     922 
1993    Emily     2     100     960 
1995    Erin     1     85     973 
1995    Opal     2     100     942 
1996    Bertha     1     90     974 
1996    Fran     2     100     954 
1997    Danny     1     70     984 
1998    Bonnie     1     95     964 
1998    Earl     1     70     987 
1998    Georges     1     90     964 
1999    Bret     2     100     951 
1999    Floyd     1     90     956 
1999    Irene     1     70     987 
2002    Lili     1     80     963 
2003   Claudette     1     80     979 
2003    Isabel     1     90     957 
2004    Alex     1     70     972 
2004    Charley     4     130     941 
2004    Gaston     1     65     985 
2004    Frances     1     90     960 
2004    Ivan     2     105     946 
2004    Jeanne     2     105     950 
2005    Cindy     1     65     992 
2005    Dennis     4     130     930 
2005    Emily     4     135     929 
2005    Irene     1     85     975 
2005    Katrina     4     150     902 
2005    Maria     2     100     960 
2005    Nate     1     80     979 
2005    Ophelia     1     80     976 
2005   Phillipe     1     70     985 
2005    Rita     4     150     897 
2005    Stan     1     70     979 
2005    Vince     1     65     987 
2005    Wilma     4     150     882 
2005    Beta     2     100     960 
2005    Epsilon     1     75     979 
2006    Ernesto     1     65     995 
2006   Florence     1     80     972 
2006    Gordon     2     105     955 
2006    Helene     2     110     954 
2006    Isaac     1     75     985 
____________________________________________________________________________________ 
Average ~         1     91     963 
Maximum ~         4     150    1002 
Minimum ~         1     65     882 
Category 1 occurrence ~   0 
BUILD SUCCESSFUL (total time: 0 seconds) 
+0

'INT类别1 = category.get(ⅰ);'在循环之前评估,当'i'为0移动它在循环内。 – njzk2

回答

1

使用Collections.frequency()

实施例:int frequency = Collections.frequency(category, category1)

+1

这将需要四次迭代才能得到所有四个类别,看起来很浪费。 –

+0

+1不错!我认为第二个参数应该只是'1',而不是'category1'。 –

1

你需要更新你的循环内检查什么。就目前而言,循环的每次迭代都会检查相同的值。

你可能需要一个

category.get(j) == 1 

if (category.get(j) <= 4) 
4

使用int[]作为计数器,就像这样:

// we won't use the 0 position 
int[] counter = new int[5]; 

遍历所有的类别。每当你发现一个新的类别,添加一个计数器:

for (int i = 0; i < category.size(); i++) { 
    int cat = category.get(i); 
    // assuming that cat is 1, 2, 3 or 4 
    counter[cat]++; 
} 

当迭代结束,counter[1]将持有第一类出现的次数,counter[2]将举行第二类出现的次数,等等。

+1

+1这似乎是最好的答案,尤其是考虑到效率。 –

1

招行

int category1 = category.get(i); 

下了线,使得它的内循环,并改变ij。这样,你每次都会检查一个不同风暴的类别,而不是只是一遍又一遍地看第一场风暴。