如何实现这样的修剪异常数据?

时间:2011-08-28 13:27:01

标签: java algorithm

我的List<Data>包含随机对象:io个字符。

数据有两种类型,i和o(Data.type)。

我想用Java编写一个函数,可以将列表排列为i,o,i,o,i,o ......。

如果遇到多个i,则应选择第一个o。如果遇到多个{{1}},则应选择最后一个。

有人能告诉我实现这个的最简单方法吗?

2 个答案:

答案 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;
}