java - 从 Java 集合中提取数据

标签 java linq csv

我有一个像这样的 csv 数据集:

A, 10, USA
B,30, UK
C,4,IT
A,20,UK
B,10,USA

我想读取此 csv 行并提供以下输出:

A has ran 30 miles with average of 15. 
B has ran 30 miles with average of 20.
C has ran 4 miles with average of 4. 

我想用Java实现这个。我已经使用 Linq 在 C# 中完成了此操作:

var readlines = File.ReadAllLines(filename);
            var query = from lines in readlines
                        let data = lines.Split(',')
                        select new
                        {
                            Name = data[0],
                            Miles = data[1],

                        };

            var values = query.GroupBy(x => new {x.Name}).Select(group => new { Person = group.Key, Events = group.Sum(g =>Convert.ToDouble(g.Miles)) ,Count = group.Count() });

我希望在 Java 中执行此操作,但我不确定是否可以在不使用任何第三方库的情况下执行此操作?有任何想法吗? 到目前为止,我的 Java 代码如下所示:

CSVReader reader = new CSVReader(new FileReader(filename));
        java.util.List<String[]> content = reader.readAll();
        String[] row = null;
        for(Object object:content)
        {
          row = (String[]) object;
          String Name = row[0];
          String Miles = row[1];



          System.out.printf("%s has ran %s miles %n",Name,Miles);
        }

           reader.close();  
        }

我正在寻找一种好方法来获取每个名称的总里程值以计算平均值。

最佳答案

作为一名 C# 开发人员,有时很难不错过 linq 的功能。但正如 Farlan 建议的那样,你可以这样做:

CSVReader reader = new CSVReader(new FileReader(filename));
    java.util.List<String[]> content = reader.readAll();
    Map<String, Group> groups = new HashMap<>();
    for(String[] row : content)
    {
        String Name = row[0];
        String Miles = row[1];

        System.out.printf("%s has ran %s miles %n", Name, Miles);

        if (groups.containsKey(Name)){
            groups.get(Name).Add(Double.valueOf(Miles));
        } else {
            Group g = new Group();
            g.Add(Double.valueOf(Miles));
            groups.put(Name, g);
        }
    }
    reader.close();

    for (String name : groups.keySet())
    {
        System.out.println(name + " ran " + groups.get(name).total() + " with avg of " + groups.get(name).average());
    }


}

class Group {
    private List<Double> miles;

    public Group()
    {
        miles = new ArrayList<>();
    }

    public Double total(){
        double sum = 0;
        for (Double mile : miles)
        {
            sum += mile;
        }
        return sum;
    }

    public Double average(){
        if (miles.size() == 0)
            return 0d;            
        return total() / miles.size();
    }

    public void Add(Double m){
        miles.add(m);
    }
}

关于java - 从 Java 集合中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465432/

相关文章:

java - 如何在多语言Android应用程序中获取选定的Radiobutton?

c# - 使用 linq 或 lambda 表达式进行对象分组

c# - 为什么LINQ操作会丢失集合的静态类型?

linux - 从 linux 中的多个 csv 文件获取数据

mongodb - 从终端上传数据到 MongoLab 数据库

python - 如何在 Python 中将数据从字典写入 CSV 文件

java - 从 Java 8 迁移到 Java 17 和 Spring 6 JUnit4 由于版本不匹配而失败

java - subListString 索引越界

Java 2D 列表在第 6 个实体之后不会打印

c# - 如何在给定 RowID 和要更新的值的情况下更新表行。 MVC C# 林克