Учитывая рисунок, вы не можете «выровнять» элементы в редакторе дизайна, используя RelativeLayout.
Послушайте, вы, вероятно, говорите о ConstraintLayout. С ConstraintLayout вы можете выравнивать элементы и ограничивать их там, где вам нужно.
https://developer.android.com/training/constraint-layout Ознакомьтесь с этим руководством.
А также, в настоящее время не так много людей используют RelativeLayout, так как он немного сложен, имеет больше проблем с производительностью, чем ConstraintLayout.
Herms разобрался в основах. Если Вы хотите Строки, а не индексы затем можно улучшиться при помощи цикла foreach Java 5:
import java.util.regex.Pattern;
import java.util.ListIterator;
import java.util.ArrayList;
/**
* Finds the index of all entries in the list that matches the regex
* @param list The list of strings to check
* @param regex The regular expression to use
* @return list containing the indexes of all matching entries
*/
List<String> getMatchingStrings(List<String> list, String regex) {
ArrayList<String> matches = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
for (String s:list) {
if (p.matcher(s).matches()) {
matches.add(s);
}
}
return matches
}
Одна опция состоит в том, чтобы использовать Apache палата общин CollectionUtils "избранный" метод. Необходимо было бы создать объект Предиката (объект с синглом "оценивают" метод, который использует регулярное выражение, чтобы проверить на соответствие и возвратить TRUE или FALSE), и затем можно искать объекты в списке то соответствие. Однако это не возвратит индексы, это возвратит набор, содержащий сами объекты.
Существует ли встроенный метод? Не то, чтобы я знаю о. Однако должно быть довольно легко сделать это самостоятельно. Вот некоторый полностью непротестированный код, который должен дать Вам основную идею:
import java.util.regex.Pattern;
import java.util.ListIterator;
import java.util.ArrayList;
/**
* Finds the index of all entries in the list that matches the regex
* @param list The list of strings to check
* @param regex The regular expression to use
* @return list containing the indexes of all matching entries
*/
List<Integer> getMatchingIndexes(List<String> list, String regex) {
ListIterator<String> li = list.listIterator();
List<Integer> indexes = new ArrayList<Integer>();
while(li.hasNext()) {
int i = li.nextIndex();
String next = li.next();
if(Pattern.matches(regex, next)) {
indexes.add(i);
}
}
return indexes;
}
у меня могло бы быть использование частей Шаблона и ListIterator немного неправильное (я никогда не использовал ни одного), но это должно дать основную идею. Вы могли также сделать простое для цикла вместо цикла с условием продолжения по итератору.
Я не полагаю, что существует Java API способ сделать это, и при этом нет Apache палаты общин способ сделать это. Это не было бы трудно к самокрутке как бы то ни было.
Это будет возрождение потока, но могло бы быть полезно для кого-то. Вам, возможно, не понадобились бы индексы, вероятно, следующий шаг сделает что-то на объектах, которые соответствовали regex, и поэтому Вы попросили индексы. Но можно использовать потоки Java8 и лямбда-выражение:
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.List;
...
var pattern = Pattern.compile(define); // var is Java 10 feature
List<String> list = originalList
.stream()
.filter(e -> pattern.matcher(e).matches())
.collect(Collectors.toList());
можно взять исходный список, преобразовать его в поток, выполнить фильтр на нем который лямбда выполнений соответствовать шаблону и преобразовать его назад в Список. Но можно сохранить его как поток и выполнить .foreach на нем с другим лямбда-выражением.