【问题标题】:How to check if an integer value is in a given array of ranges and which array element如何检查整数值是否在给定的范围数组中以及哪个数组元素
【发布时间】:2022-01-21 13:36:17
【问题描述】:

得到一个 json 文件,它加载了一些配置数组,如下所示:

configs.json

[
  {
    "category":"A",
    "scoreMargins" : [[12], [9,11], [7,9], [5,6], [3,4]]
  },
  {
    "category":"B",
    "scoreMargins" : [[3,4], [5,6], [7,8], [9,10], [11, 12]]
  }
]

scoreMargins 不是一种精确的格式,因此它目前被反序列化为一个对象。但范围数(或单个值)始终为 5。

CalculationValues.java

 public class StressTestCategoryCalculationValues {
   private String category;
   private Object scoreMargins;
 }

服务:

List<CalculationValues> values = mapper.readValue(CalculationValues.class.getResourceAsStream('configs.json'),
            mapper.getTypeFactory().constructCollectionType(List.class, CalculationValues.class));

Optional<CalculationValues> configA = values.stream()
            .filter(p -> p.getCategory().equals("A"))
            .findFirst();

int sumA = xx;
if (configA.isPresent()) {
    // logic
}

我想获取scoreMargins 数组元素中的哪个sumA 属于..

例如:

"scoreMargins" : [[3,4], [5,8], [8,11], [11,12], [12, 13]], 

 sumA = 7, result ??

 Desired result =  2 (3rd element)

最简单的方法是什么?

【问题讨论】:

  • configs.json 故意"scoreMargins" : [12, [10,11], [7,9], [5,6], [3,4]] 还是应该是"scoreMargins" : [[12], [10,11], [7,9], [5,6], [3,4]],如果您始终将其设为数组数组,则反序列化会更容易。
  • 似乎scoreMargins 应该是int[][] 类型(而不是对象)。然后循环 scoreMargins 以找到 sumaA 适合的位置。
  • 我也不确定你的结果应该是什么?是否要返回数组、数字、整个 CalculationValues 对象?
  • @IgorFlakiewicz 只是特定元素的数组索引就足够了

标签: java arrays json-deserialization


【解决方案1】:

我有一个解决方案,但是在使用 json 时,它不能保证在 api 之间传递时保留数组顺序,因此如果不将确切的输入 json 作为字符串返回,则无法保证您的索引是准确的索引...

因此,这更多是在 json 中反序列化二维数组的示例。

int getIndex(CalcValues cv, int sumA) {

    for (List<Integer> sm : cv.getScoreMargins()) {
        sm = sm.stream().sorted().collect(Collectors.toList());

        if (sm.get(0) == sumA) {
            return cv.getScoreMargins().indexOf(sm);
        }

        if (sm.size() > 1 && sm.get(0) <= sumA && sm.get(1) >= sumA) {
            return cv.getScoreMargins().indexOf(sm);
        }

    }

    return 0;
}

class CalcValues {

    private String category;
    private List<List<Integer>> scoreMargins;

    // getter and setter

}

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2021-12-15
    • 1970-01-01
    • 2012-05-12
    • 2014-03-28
    相关资源
    最近更新 更多