我已经尝试过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();
}
}
答案 0 :(得分:3)
看看guavas MultiMap
。这正是你要找的。 p>
答案 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循环。
解决方案的步骤:
遍历arrayList
获取第一个包含[A,MANBA]字符串
根据逗号分割字符串,获取值A
现在将值A传递给一个函数,您将在该函数中检查ArrayList中A的出现次数。
大多数情况下,这将为您提供并发异常,因为您将处理相同的arraylist。
更好的解决方案:
使用guava-libraries Multimap,这将更适合您的场景