我如何计算arraylist?

时间:2014-05-13 10:27:16

标签: java arraylist

我已经尝试过Scanner将文本文件读入arraylist。 让我们假设我有一个这样的arraylist

[A, MANBA]
[A, PGD]
[A, GUSB]
[A, GLB1]
[B, HS6ST1]
[B, NDST1]
[B, NDST4]
[C, NRP1]
[C, ZEB1]

如何计算第一个值的出现并将其打印出来? 作为这个特例,输出将是

A  4
B  3
C  2

这是我到目前为止的代码。任何建议都会很感激。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class PI_list{
public static void main (String[] args) throws FileNotFoundException
{
    Scanner inputFile = new Scanner(new File("/home/tab.csv"));
    while(inputFile.hasNextLine()){
        String line = inputFile.nextLine();
        ArrayList<String> PPIData = new ArrayList<String>();
        Scanner scanner = new Scanner(line);
        scanner.useDelimiter("\t");
        while(scanner.hasNext()){
            PPIData.add(scanner.next());
        }
        scanner.close();

        System.out.println(PPIData);
    }

    inputFile.close();
    }
}

3 个答案:

答案 0 :(得分:3)

看看guavas MultiMap。这正是你要找的。

答案 1 :(得分:0)

简单的方法

public String countOccurences(String letter,List<String> array){
  int counter = 0; 
  for(String s : array){
      if(s.equals(letter))
        counter++;
   }
  return letter + ": " + String.valueOf(counter);
}

public void getResult(List<String> array){
  Set<String> setOfLetters = new HashSet<String>();
  List<String> dataArray = new ArrayList<String>();
  for(String s: array){
     s.replace("[","");
     s.replace("]","");
     String tab[] = s.split(",");
     setOfLetters.add(tab[0]);
     dateArray.add(tab[0]);
 }
 for(String s: setOfLetters)
    countOccurences(s,dataArray);
}

所以简单地说你的代码应该是那样的

public static void main (String[] args) throws FileNotFoundException
{
    Scanner inputFile = new Scanner(new File("/home/tab.csv"));
    while(inputFile.hasNextLine()){
        String line = inputFile.nextLine();
        ArrayList<String> PPIData = new ArrayList<String>();
        Scanner scanner = new Scanner(line);
        scanner.useDelimiter("\t");
        while(scanner.hasNext()){
            PPIData.add(scanner.next());
        }
        scanner.close();
        getResult(PPIData);
        System.out.println(PPIData);
    }

当然可以访问我的上述方法。

合并它的所有类应该看起来像

public class PI_list {

    public static String countOccurences(String letter, List<String> array) {
        int counter = 0;
        for (String s : array) {
            if (s.equals(letter))
                counter++;
        }
        return letter + ": " + String.valueOf(counter);
    }

    public static void getResult(List<String> array) {
        Set<String> setOfLetters = new HashSet<String>();
        List<String> dataArray = new ArrayList<String>();
        for (String s : array) {
            s.replace("[", "");
            s.replace("]", "");
            String tab[] = s.split(",");
            setOfLetters.add(tab[0]);
            dataArray.add(tab[0]);
        }
        for (String s : setOfLetters)
            System.out.println(countOccurences(s, dataArray));
    }

    public static void main(String[] args) throws FileNotFoundException {
        Scanner inputFile = new Scanner(new File("/home/tab.csv"));
        while (inputFile.hasNextLine()) {
            String line = inputFile.nextLine();
            ArrayList<String> PPIData = new ArrayList<String>();
            Scanner scanner = new Scanner(line);
            scanner.useDelimiter("\t");
            while (scanner.hasNext()) {
                PPIData.add(scanner.next());
            }
            getResult(PPIData);
            System.out.println(PPIData);
        }
        inputFile.close();
    }

}

答案 2 :(得分:0)

根据您的代码

while(inputFile.hasNextLine()){
        String line = inputFile.nextLine();
        ArrayList<String> PPIData = new ArrayList<String>();
        Scanner scanner = new Scanner(line);
        scanner.useDelimiter("\t");
        while(scanner.hasNext()){
            PPIData.add(scanner.next());
        }
        scanner.close();

        System.out.println(PPIData);
    }

    inputFile.close();
    }

arraylist是本地范围的,所以你不能在while循环之外使用它。

如果您想稍后使用它,可以计算字母的出现次数,然后将其声明为while循环。

解决方案的步骤:

  1. 遍历arrayList

  2. 获取第一个包含[A,MANBA]字符串

  3. 的元素
  4. 根据逗号分割字符串,获取值A

  5. 现在将值A传递给一个函数,您将在该函数中检查ArrayList中A的出现次数。

  6. 大多数情况下,这将为您提供并发异常,因为您将处理相同的arraylist。

    更好的解决方案:

    使用guava-libraries Multimap,这将更适合您的场景