我的List<Data>
包含随机对象:i
和o
个字符。
数据有两种类型,i和o(Data.type
)。
我想用Java编写一个函数,可以将列表排列为i,o,i,o,i,o ......。
如果遇到多个i
,则应选择第一个o
。如果遇到多个{{1}},则应选择最后一个。
有人能告诉我实现这个的最简单方法吗?
答案 0 :(得分:4)
如果您在结果字符串中选择要显示的第一个或最后一个字符,则没有什么区别,所以试试这个[它总是需要第一个匹配的字符]:
(*)假设输入的格式为'str'
String str = "ioooioooiooiiiiooo";
StringBuilder sb = new StringBuilder();
Matcher matcher = Pattern.compile("i+|o+").matcher(str);
while (matcher.find()) {
sb.append(str.charAt(matcher.start())).append(',');
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length()-1);
}
System.out.println(sb);
使用sb.toString()
从StringBuilder
修改强>
只是注意到您的输入是一个列表,假设它是List<Character>
,您可以执行以下操作,当然您可以将其更改为List<AnyOtherObject>
。
List<Character> result = new LinkedList<Character>();
Iterator<Character> iter = list.iterator();
if (!iter.hasNext()) { /*handle empty list and return*/ }
Character last = iter.next();
if (last.charValue() == 'i') {
result.add(last);
}
while (iter.hasNext()) {
Character current = iter.next();
if (last.charValue() == current.charValue()) {
last = current; //we don't care for i's which i is the last, but we do for o's, so we set it anyway.
continue;
} else if (current.charValue() == 'i') {
result.add(last);
result.add(current);
}
last = current;
}
if (last.charValue() == 'o') {
result.add(last);
}
答案 1 :(得分:1)
如果我看到了,你已经定义了一些这样的Data类:
public class Data {
private char type;
private Foo value; // placeholder for whatever else this kind of
// object represents
public char getType () {
return type;
}
// other methods...
}
您还有一些List<Data>
包含这些的集合
对象。现在,您要创建一个全新的List<Data>
具有相同Data
的多个type
的序列是混合的
单个元素。如果它是Data
的序列i
,
单个元素应该是该序列的第一个元素,
否则它应该是它的最后一个元素。
这将产生如下代码:
public List<Data> conflateList (List<Data> longList) {
List<Data> resultList = new ArrayList<Data>();
for (Data element: longList) {
if (element.getType() == 'i' &&
(resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'o')) {
// only the first consecutive `i` is added
resultList.add(lastElement);
}
if (element.getType() == 'o') {
if (resultList.size() == 0 ||
resultList.get(resultList.size() - 1).getType() == 'i') {
// all `o`s are at least temporarily added
resultList.add(element);
} else {
// consecutive `o`s are replaced
resultList.set(resultList.size() - 1, element);
}
}
}
return resultList;
}