gpt4 book ai didi

java - 对列表中的项目进行分组并对所有其他字段求和 Android,在 recyclerview 中显示结果

转载 作者:行者123 更新时间:2023-12-02 06:11:34 25 4
gpt4 key购买 nike

我有一个具有以下结构的 Firebase 数据库

{
"foo" : {
"data" : {
"2019-12-01" : [ {
"item1" : 8,
"item2" : 16,
"name" : "user1"
}, {
"item1" : 9,
"item2" : 18,
"name" : "user2"
} ],
"2019-12-02" : [ {
"item1" : 2,
"item2" : 26,
"name" : "user1"
}, {
"item1" : 6,
"item2" : 6,
"name" : "user2"
} ]
}
}
}

我正在以一种非常简单的方式在主 Activity 中填充一个recyclerviewer:

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;

private RecyclerView.LayoutManager layoutManager;
private Adapter adapter;

final List<Model> tempList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


recyclerView = findViewById(R.id.simpleRecycler);

layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);

Query statsRef = FirebaseDatabase.getInstance()
.getReference("foo")
.child("data")
.orderByKey()
.startAt("2019-12-01")
.endAt("2019-12-02");

// Read from the database
statsRef.addValueEventListener(new ValueEventListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

for (DataSnapshot itemSnapshot : dataSnapshot.getChildren()){
for (int i = 0; i < 2; i++) {
Model model = itemSnapshot.child(String.valueOf(i)).getValue(Model.class);
tempList.add(model);
}
}

adapter = new Adapter(tempList);
recyclerView.setAdapter(adapter);
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}

适配器是:

public class Adapter extends RecyclerView.Adapter {

List<Model> models;

public Adapter(List<Model> models) {
this.models = models;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_row, parent, false);

return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ViewHolder vh = (ViewHolder)holder;

vh.name.setText(models.get(position).getName());
vh.item1.setText(String.valueOf(models.get(position).getItem1()));
vh.item2.setText(String.valueOf(models.get(position).getItem2()));
}

@Override
public int getItemCount() {
return models.size();
}
}

结果是这样的表格:

+-------+---+----+
| user1 | 8 | 16 |
+-------+---+----+
| user2 | 9 | 18 |
+-------+---+----+
| user1 | 2 | 26 |
+-------+---+----+
| user2 | 6 | 6 |
+-------+---+----+

问题是我想按名称对列表进行分组,然后将所有其他相关字段相加,如下所示

+-------+----+----+
| user1 | 10 | 42 |
+-------+----+----+
| user2 | 15 | 24 |
+-------+----+----+

我尝试过,但没有成功:

tempList.stream().collect(Collectors.groupingBy(Model::getName))
.entrySet().stream()
.collect(Collectors.toMap(x -> {
int item1 = x.getValue().stream().mapToInt(Model::getItem1).sum();
int item2 = x.getValue().stream().mapToInt(Model::getItem2).sum();

return new Model(x.getKey(), item1, item2);

}, Map.Entry::getValue));

在将适配器设置为 recyclerviewer 之前,我已添加上述代码。

请问有什么帮助吗?

最佳答案

您可以使用 Collectors.toMap操作 mergeFunction定义为执行聚合,例如:

List<Model> output = new ArrayList<>(tempList.stream()
.collect(Collectors.toMap(Model::getName, Function.identity(),
Model::mergeSimilarNames))
.values()); // interested in merged output

合并函数可以在 Model 中定义类为:

static Model mergeSimilarNames(Model one, Model two) {
return new Model(one.getName(), one.getItem1() + two.getItem1(), one.getItem2() + two.getItem2());
}

为了将其与您现有的方法联系起来,您需要在对元素进行分组后进行归约操作,例如:

Map<String, Optional<Model>> grouping = tempList.stream()
.collect(Collectors.groupingBy(Model::getName,
Collectors.reducing(Model::mergeSimilarNames)));

但是您只对获得最终 View 感兴趣,如 List<Model>上述值 Map ,因此您的结果代码将是这种情况:

List<Model> output = tempList.stream()
.collect(Collectors.groupingBy(Model::getName,
Collectors.reducing(Model::mergeSimilarNames)))
.values().stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());

但请注意, toMap(f1,f2,f3) is preferred over groupingBy(f1, reducing(f2,f3)) .

关于java - 对列表中的项目进行分组并对所有其他字段求和 Android,在 recyclerview 中显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59330943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com