【问题标题】:How to make an array based on string如何根据字符串创建数组
【发布时间】:2018-01-08 12:11:24
【问题描述】:

我有记录集,其中包含列产品和状态。

例如:

Product    Status
salt       good
sugar      bad
salt       bad
sugar      good
sugar      good

稍后在报告中我需要根据状态进行总结,像这样

summary good 
product_code   sum
sugar          2
salt           1

summary bad 
product_code   sum
sugar          1
salt           1

我正在用excel做报告,根据我读到的内容,我可以确定使用多少盐好或坏

Collections.frequency(collection, key)

来自here

所以我想我必须区分好坏列表,然后计算存在多少盐、糖和任何其他产品。这就是我现在的进度

rs = impl.showOnlyColumn(query);;
            ResultSetMetaData metaData = rs.getMetaData();

            int colProduct = 0;
            int colStatus = 0;

            String dataProd="";
            String dataStat="";
            Map<String, String[]> mapinData= new HashMap<String, String[]>();
            //making column name on excel
            int columnCount = metaData.getColumnCount();
            for (int column = 1; column <= columnCount; column++) {
                label = new Label(column - 1, 2, metaData.getColumnName(column));
                excelSheet.addCell(label);

                // check if column is product or status 
                String columnName = metaData.getColumnName(column).toLowerCase();
                if (columnName.contains("produ")) {
                    colProduct = column;
                } else if (columnName.contains("status")) {
                    colStatus = column;
                }
            }
            //render the data
            int r = 3;
            while (rs.next()) {
                for (int column = 0; column <= columnCount - 1; column++) {
                    String cellValue = (rs.getString(column + 1) == null ? "" : rs.getString(column + 1));
                    label = new Label(column, r, cellValue);
                    excelSheet.addCell(label);
                    if (column == colProduct) {
                        dataProd = cellValue;
                    }else if (column==colStatus) {
                        dataStat = cellValue;
                    }
                }        
                mapinData.put(dataStat,dataProd);
                r++;
            }

            myFirstWbook.write();

问题是我不知道如何根据状态名称创建一个数组

mapinData.put(dataStat,how to make array here?);

然后我将获取数组,用于计算具有该状态的产品的总和

如果有什么我描述不好的地方请告诉我,非常感谢你的帮助。

【问题讨论】:

  • 改用Map&lt;String, List&lt;String&gt;&gt;。

标签: java arrays hashmap


【解决方案1】:

使用Map&lt;String, List&lt;String&gt;&gt; 代替Map&lt;String, String[]&gt;。

rs = impl.showOnlyColumn(query);;
ResultSetMetaData metaData = rs.getMetaData();

int colProduct = 0;
int colStatus = 0;

String dataStat="";
Map<String, List<String>> mapinData= new HashMap<>();
//making column name on excel
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
    label = new Label(column - 1, 2, metaData.getColumnName(column));
    excelSheet.addCell(label);

    // check if column is product or status 
    String columnName = metaData.getColumnName(column).toLowerCase();
    if (columnName.contains("produ")) {
        colProduct = column;
    } else if (columnName.contains("status")) {
        colStatus = column;
    }
}
//render the data
int r = 3;
while (rs.next()) {
    List<String> dataProdList = new ArrayList<>();
    for (int column = 0; column <= columnCount - 1; column++) {
        String cellValue = (rs.getString(column + 1) == null ? "" : rs.getString(column + 1));
        label = new Label(column, r, cellValue);
        excelSheet.addCell(label);
        if (column == colProduct) {
            dataProdList.add(cellValue);
        } else if (column == colStatus) {
            dataStat = cellValue;
        }
    }
    dataProdList.addAll(mapinData.getOrDefault(dataSet, new ArrayList<>()));
    mapinData.put(dataStat, dataProdList);
    r++;
}

myFirstWbook.write();

【讨论】:

  • 在尝试您的代码后,dataprodlist 出错可能是因为它在 for 内部,因此无法从中访问,而且我找不到 mapindata.getordefault 我是否使用了错误的导入?我正在使用 import java.util.HashMap;
  • getOrDefault 在 java 8 中可用,我犯了一个错误,这个函数需要两个参数,我已经更新了我的代码。
  • 顺便说一句,dataSet 是新变量吗?
  • 是的,dataSet 是我刚刚添加的密钥。
  • 你不必使用getOrDefault(),你可以使用contains()然后get()。 if (mapinData.contains(dataStat)) { dataProdList.addAll(mapinData.get(dataSet)); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2017-01-05
  • 2015-06-07
相关资源
最近更新 更多