Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to find highest and lowest value on substrings?

I have this code:

String s_prices = "19; 16; 20; 01; 16; 1.3; 1.6; 50; 2.0; 17";

// Convert to List of strings:
// ["19", "16", "20", "01", "16", "1.3", "1.6", "50", "2.0", "17"]
        List<String> prices = Arrays.asList(s_prices.split("; "));

// Convert to List of 3-element lists of strings (possibly fewer for last one):
// [["19", "16", "20"], ["01", "16", "1.3"], ["1.6","50", "2.0"], ["17"]]
        List<List<String>> partitions = new ArrayList<>();
        for (int i = 0; i < prices.size(); i += 3) {
            partitions.add(prices.subList(i, Math.min(i + 3, prices.size())));
        }

// Convert each partition List to a comma-delimited string
// ["13, 16, 20", "01, 16, 1.3", "1.6, 50, 2.0", "17"]
        List<String> substrings = partitions.stream().map(p -> String.join(", ", p)).collect(Collectors.toList());


// Output each list element on a new line to view the results
        System.out.println(String.join("\n", substrings));
        TextView tv = findViewById(R.id.pprices);
        tv.setText(String.join("\n", substrings ));

and I want to find the highest and the lowest price on every substring and show results on TextView as follows

19, 16, 20  High: 20, Low: 16
01, 16, 1.3  High: 16, Low: 01
1.6, 50, 2.0  High: 50, Low: 1.6
17  High: 17, Low: 17

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

The Collections.max and Collections.min methods return the largest/smallest element in a list. These can be used while mapping the partitions list with Stream.map to return the results in the format you’re looking for:

Comparator<String> numberValueComparator = Comparator.comparing(BigDecimal::new);
List<String> groupedValue = partitions.stream()
        .map(p -> String.format("%s  High: %s, Low: %s",
                String.join(", ", p),
                Collections.max(p, numberValueComparator),
                Collections.min(p, numberValueComparator)))
        .toList();

System.out.println(String.join("\n", groupedValue));

Output:

19, 16, 20  High: 20, Low: 16
01, 16, 1.3  High: 16, Low: 01
1.6, 50, 2.0  High: 50, Low: 1.6
17  High: 17, Low: 17

Note that it’s important to compare the numeric value of the string, rather than the string itself. For instance, using the natural order of strings, "1001" < "17". This is why this is using a Comparator that first converts the number to a BigDecimal using the BigDecimal(String) constructor, and then compares those values.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading