Как сделать этот цикл в java

У меня есть количество объектов ппg>, у которых есть свойство, называемое статусом. Поэтому мне нужно проверить это свойство на всех объектах и ​​найти единое значение для всех объектов.

Позволь мне объяснить.

Свойство статуса может иметь такие значения (Строки) - «1», «2», «3», «4», «5», «7», «завершено», «не завершено», ..... . (любая строка кроме 1..7)

  • Я пройдусь по всем объектам, и если свойство status имеет значение 1-7 для любого из объектов, будет выбран более высокий, тогда будет выбрано это значение. пример

obj1.status = "1", obj2.status = "6". Value Selected = "6"

obj1.status = "4", obj2.status = "2". Value Selected = "4"

obj1.status = "7", obj2.status = "6". Value Selected = "7"

  • Если ни один из объектов не имеет свойства status от 1 до 7, то выбрано значение "XYZ". пример

obj1.status = "completed", obj2.status = "abc". Value Selected = "XYZ"

obj1.status = "abc", obj2.status = "def". Value Selected = "XYZ"

obj1.status = "jkl", obj2.status = "mno". Value Selected = "XYZ"

Если хотя бы один из объектов имеет свойство status как 1-7, а все остальные имеют другие строки, то будет выбрано числовое значение.

obj1.status = "abc", obj2.status = "1". Value Selected = "1"

obj1.status = "abc", obj2.status = "5",obj3.status = "4",. Value Selected = "5"

они объект json ??

Shubh 27.09.2018 10:42

что ты уже испробовал?

Turamarth 27.09.2018 10:43

@Jai --- нет. Это ядро ​​java. Статус - это собственность этих объектов.

Naxi 27.09.2018 10:46

установить текущий результат на 0, затем перебрать объекты. Если вы обнаружите, что числовой статус больше текущего результата, установите текущий результат соответствующим образом. Если текущий результат равен 0, вернуть XYZ, иначе вернуть текущий результат.

Ronald 27.09.2018 10:47

@ Turamarth: Я не могу найти хороший способ сделать это. Пробовал разные циклы, но это не дает мне необходимой функциональности.

Naxi 27.09.2018 10:47

Какой должен быть результат, если нет предметов? Я полагаю "XYZ"

Robert Kock 27.09.2018 10:48

@Роберт. Мой вариант использования гарантирует, что всегда есть хотя бы один объект.

Naxi 27.09.2018 10:51

Разве мы не можем создать собственный компаратор и выбрать первый элемент после сортировки?

Nisarg Patil 27.09.2018 10:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
126
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Это будет примерно так:

String regex = "[1-7]";
int max = 0;
int number;

for (Object obj : objectList){
  if (obj.status().matches(regex)){
      number = Integer.valueOf(obj.status());
      if (number > max){
        max=number;
     }
  }
}
if (max==0){
  System.out.println("XYZ");} 
else{
  System.out.println(String.valueOf(max));
}
int max = "XYZ" ??
Robert Kock 27.09.2018 10:51

Попробуй это

    String newStatus = list.stream()
            .map(Obj::getStatus)
            .map(x -> {
                try {
                    return Integer.parseInt(x);
                } catch (NumberFormatException ignore) {
                    return null;
                }
            })
            .filter(Objects::nonNull)
            .max(Comparator.naturalOrder())
            .map(x -> Integer.toString(x))
            .orElse("XYZ");

    list.forEach(x -> x.setStatus(newStatus));

Obj - это тип ваших объектов.

Это классический алгоритм сокращения. (Никаких приведений и регулярных выражений не требуется.)

BinaryOperator<String> reducer = (v1, v2) -> {
    if (v1.length() == 1 && v1.compareTo("1") >= 0 && v1.compareTo("7") <= 0) {
        // v1 is a number - return v2 if higher number, else v1
        return v2.length() == 1 && v2.compareTo("1") >= 0 && v2.compareTo("7") <= 0 && v1.compareTo(v2) < 0 ? v2 : v1;
    } else {
        // v1 is not a number - return v2 if number, else "XYZ" 
        return v2.length() == 1 && v2.compareTo("1") >= 0 && v2.compareTo("7") <= 0 ? v2 : "XYZ";
    }
};

Тестовое задание:

Stream<String> of1 = Stream.of("3", "1", "2");
Stream<String> of2 = Stream.of("1", "incomplete", "2");
Stream<String> of3 = Stream.of("incomplete", "status");
System.out.println(of1.reduce(reducer).get()); // 3
System.out.println(of2.reduce(reducer).get()); // 2
System.out.println(of3.reduce(reducer).get()); // XYZ

Может быть, что-то в этом роде:

Optional<YourObject> optional = test.stream().
filter(object -> (object.status.matches("[1-7]"))).sorted((o1, o2) -> Integer.valueOf(o2.status).compareTo(Integer.valueOf(o1.status))).findFirst();
String value = optional.isPresent() ? optional.get().status : "XYZ";
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;

import org.junit.Assert;
import org.junit.Test;

public class LoopTest {

    private class Item {
        private String status = "";

        public Item(String status) {
            if (status != null)
                this.status = status;
        }

        public String getStatus() {
            return status;
        }       
    }

    private static final Pattern MY_REXP = Pattern.compile("[1-7]");
    private String getValue(List<Item> listValues) {
        if (listValues == null)
            return "XYZ";

        Optional<Item> opItem = listValues.stream().filter(item -> MY_REXP.matcher(item.getStatus()).matches()).max(new Comparator<Item>() {
            @Override
            public int compare(Item o1, Item o2) {
                if (o1 == null || o2 == null)
                    return -1;
                return o1.getStatus().compareTo(o2.getStatus());
            }
        });
        return opItem.isPresent() ? opItem.get().getStatus() : "XYZ";
    }

    @Test
     public void test1() {
        try {
            List<Item> listValues = Arrays.asList(new Item("1"), new Item("6"));
            String result = getValue(listValues);
            Assert.assertTrue("6".equals(result));
        } catch (Exception ex) {
            Assert.fail("Exception " + ex);
        }
    }

    @Test
     public void test2() {
        try {
            List<Item> listValues = Arrays.asList(new Item("completed"), new Item("8"));
            String result = getValue(listValues);
            Assert.assertTrue("XYZ".equals(result));
        } catch (Exception ex) {
           Assert.fail("Exception " + ex);
       }
    }

    @Test
     public void test3() {
        try {
            List<Item> listValues = Arrays.asList(new Item("abc"), new Item("5"), new Item("4"));
            String result = getValue(listValues);
            Assert.assertTrue("5".equals(result));
        } catch (Exception ex) {
           Assert.fail("Exception " + ex);
       }
    }

}

Другие вопросы по теме