Как сделать этот цикл в Java - PullRequest
       1

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

0 голосов
/ 27 сентября 2018

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

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

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

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

obj1.status = "1", obj2.status = "6".Выбранное значение = "6"

obj1.status = "4", obj2.status = "2".Выбранное значение = "4"

obj1.status = "7", obj2.status = "6".Выбранное значение = "7"

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

obj1.status = "завершено", obj2.status = "abc".Выбранное значение = "XYZ"

obj1.status = "abc", obj2.status = "def".Выбранное значение = "XYZ"

obj1.status = "jkl", obj2.status = "mno".Выбранное значение = "XYZ"

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

obj1.status = "abc", obj2.status = "1".Выбранное значение = "1"

obj1.status = "abc", obj2.status = "5", obj3.status = "4" ,.Выбранное значение = "5"

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018
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);
       }
    }

}
0 голосов
/ 27 сентября 2018

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

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";
0 голосов
/ 27 сентября 2018

Попробуйте это

    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 тип ваших объектов.

0 голосов
/ 27 сентября 2018

Это классический алгоритм уменьшения.(Без приведения и регулярных выражений.)

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
0 голосов
/ 27 сентября 2018

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

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...