为了账号安全,请及时绑定邮箱和手机立即绑定

从 csv 文件中获取最高列值并将其存储到 arraylist

从 csv 文件中获取最高列值并将其存储到 arraylist

慕仙森 2022-06-04 10:44:24
我正在尝试将具有最高管理值的名称的子名称存储到 arraylistONE 中。在这种情况下,万能面粉是1 3/4 cups all-purpose flour泡打粉是1/4 teaspoon baking soda and 1/2 cup of plain小苏打是8 teaspoons of baking powder如果一个名称只有 0个管理值,它应该是,Brewed Coffee它应该始终将第一个值存储在文件中1 cup brewed coffee对于其他管理价值较小的数据,它们被存储到 arraylistTWO 中。我一直在阅读 csv 文件,我不知道如何将具有最高管理值的名称的子名称存储到 arraylistONE 中,而对于具有较小管理值的其余数据,我不知道如何存储到 arraylistTWO 中。这是我到目前为止所做的工作:try {    br = new BufferedReader (new FileReader ("/sdcard/TABLE_BF.csv"));    while ((sCurrentline = br.readLine ()) != null) {           subIng.add(sCurrentline.split (","));    }    arrSubIng = new String[subIng.size ()][];    subIng.toArray (arrSubIng);} catch (IOException e) {        e.printStackTrace ();}
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

首先,我认为创建一个简单的类来保存数据是有意义的,因为使用对象而不是值数组来过滤和排序会更容易。


public class Ingredient {

    String name;

    String subName;

    int status;

    int admin;


    public Ingredient(String name, String subName, String status, String admin) {

        this.name = name;

        this.subName = subName;

        this.status = Integer.valueOf(status);

        this.admin = Integer.valueOf(admin);

    }


    public String getName() {

        return name;

    }

    public int getAdmin() {

        return admin;

    }

    //more get and set methods here. I have only included what is needed for my answer

}

然后你阅读并创建一个Ingredient对象列表。


List<Ingredient> data = new ArrayList<>();

try {

    String sCurrentline = null;

    BufferedReader br = new BufferedReader(new FileReader("/sdcard/MAIN_BF.csv"));

    while ((sCurrentline = br.readLine()) != null) {

        String[] arr = sCurrentline.split(",");

        Ingredient ingredient = new Ingredient(arr[0], arr[1], arr[2], arr[3]);

        data.add(ingredient);

    }

    br.close();

} catch (IOException e) {

    e.printStackTrace();

}

然后我们按名称将列表分组为Map


Map<String, List<Ingredient>> ingredientsByName = data.stream().collect(Collectors.groupingBy(Ingredient::getName));

并遍历该地图以找到每种成分的最大管理值并将它们添加到正确的列表中


List<Ingredient> main = new ArrayList<>();

List<Ingredient> other = new ArrayList<>();


//Sort on `admin` in descending order

Comparator<Ingredient> compartor = Comparator.comparing(Ingredient:: getAdmin, (i1, i2) -> {

    if (i2 > i1) {

        return -1;

    } else if (i2 < i1) {

        return 1;

    } 

    return 0;

});


//Go through each list (ingredient) and find the one with max `admin` value 

//and add it to the `main` list then add the rest to `other`

ingredientsByName.forEach( (k, group) -> {

    Ingredient max = group.stream().max(compartor).get();

    if (max.getAdmin() == 0) {

        max = group.get(0);

    }

    main.add(max);

    group.remove(max);

    other.addAll(group);

});


查看完整回答
反对 回复 2022-06-04
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

我会将文件的全部内容加载到内存中并将其存储在java.util.List<String>List然后你可以按Nameadmin排序。然后只需遍历List. 每当您点击不同的Name时,您就知道其关联的admin值是最大的。因此,您将其添加到您的 first 中ArrayList,并将所有其他人添加到您的 secondArrayList中。



查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信