У меня есть количество объектов
Позволь мне объяснить.
Свойство статуса может иметь такие значения (Строки) - «1», «2», «3», «4», «5», «7», «завершено», «не завершено», ..... . (любая строка кроме 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"
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"
что ты уже испробовал?
@Jai --- нет. Это ядро java. Статус - это собственность этих объектов.
установить текущий результат на 0, затем перебрать объекты. Если вы обнаружите, что числовой статус больше текущего результата, установите текущий результат соответствующим образом. Если текущий результат равен 0, вернуть XYZ, иначе вернуть текущий результат.
@ Turamarth: Я не могу найти хороший способ сделать это. Пробовал разные циклы, но это не дает мне необходимой функциональности.
Какой должен быть результат, если нет предметов? Я полагаю "XYZ"
@Роберт. Мой вариант использования гарантирует, что всегда есть хотя бы один объект.
Разве мы не можем создать собственный компаратор и выбрать первый элемент после сортировки?




Это будет примерно так:
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" ??
Попробуй это
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);
}
}
}
они объект json ??