如何在Android Studio(Java)中处理药品类结构化数据?
在Android Studio中用Java处理药品分组数据的方案
1. 定义数据模型类
先创建对应药品字段的实体类,用来封装单条药品数据:
public class Drug { private String genericName; private String brandName; private String companyName; private String regNumber; public Drug(String genericName, String brandName, String companyName, String regNumber) { this.genericName = genericName; this.brandName = brandName; this.companyName = companyName; this.regNumber = regNumber; } // Getter & Setter 方法 public String getGenericName() { return genericName; } public void setGenericName(String genericName) { this.genericName = genericName; } public String getBrandName() { return brandName; } public void setBrandName(String brandName) { this.brandName = brandName; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getRegNumber() { return regNumber; } public void setRegNumber(String regNumber) { this.regNumber = regNumber; } }
2. 按GenericName分组数据
用HashMap<String, List<Drug>>作为分组容器,Key存通用名(GenericName),Value存对应通用名下的所有药品列表:
// 假设你已通过数据源获取到原始药品列表 List<Drug> rawDrugList = getRawDrugData(); // 初始化分组容器 Map<String, List<Drug>> groupedDrugs = new HashMap<>(); // 遍历原始数据完成分组 for (Drug drug : rawDrugList) { String genericName = drug.getGenericName().trim(); // 若当前通用名无对应列表则创建新列表,再添加药品 groupedDrugs.computeIfAbsent(genericName, k -> new ArrayList<>()).add(drug); }
3. 常见数据加载方式
从本地JSON文件加载
将药品数据存放在assets目录下的drugs.json文件中,读取并解析:
private List<Drug> getRawDrugDataFromAssets() throws IOException { AssetManager assetManager = getAssets(); InputStream inputStream = assetManager.open("drugs.json"); byte[] buffer = new byte[inputStream.available()]; inputStream.read(buffer); inputStream.close(); String jsonContent = new String(buffer, StandardCharsets.UTF_8); // 使用Gson解析JSON(需在build.gradle添加依赖:implementation 'com.google.code.gson:gson:2.10.1') Gson gson = new Gson(); return Arrays.asList(gson.fromJson(jsonContent, Drug[].class)); }
从SQLite数据库加载
若数据存在本地数据库,可使用Room框架简化操作:
首先定义DAO接口:
@Dao public interface DrugDao { @Query("SELECT * FROM drugs") List<Drug> getAllDrugs(); // 支持直接按通用名查询,减少内存分组操作 @Query("SELECT * FROM drugs WHERE genericName = :genericName") List<Drug> getDrugsByGenericName(String genericName); }
通过DAO获取全量数据后,再执行分组逻辑即可。
4. 常用数据操作
查询指定通用名下的药品
String targetGeneric = "Paracetamol"; List<Drug> targetDrugs = groupedDrugs.getOrDefault(targetGeneric, new ArrayList<>());
分组内按公司名称排序
for (Map.Entry<String, List<Drug>> entry : groupedDrugs.entrySet()) { List<Drug> drugs = entry.getValue(); // 忽略大小写排序 Collections.sort(drugs, (d1, d2) -> d1.getCompanyName().compareToIgnoreCase(d2.getCompanyName())); }
过滤指定药企的药品
String targetCompany = "ABC Pharma"; Map<String, List<Drug>> filteredGroups = new HashMap<>(); for (Map.Entry<String, List<Drug>> entry : groupedDrugs.entrySet()) { List<Drug> filteredDrugs = entry.getValue().stream() .filter(drug -> drug.getCompanyName().equals(targetCompany)) .collect(Collectors.toList()); if (!filteredDrugs.isEmpty()) { filteredGroups.put(entry.getKey(), filteredDrugs); } }
5. UI展示思路(可选)
若需在界面展示分组数据,可选择:
- 使用
ExpandableListView直接实现分组展开/收起效果 - 自定义RecyclerView Adapter,区分分组标题项和药品子项,加载不同布局实现分组展示
内容的提问来源于stack exchange,提问作者Md.Alireza Khan
相关产品推荐
相关产品推荐

