5

我有一个对象列表,我想根据条件处理对象子集,然后创建一个包含已处理对象的新列表。

对象列表

miss | shannon sperling
mr | john smith
prof | kim taylor
prof.dr | kim taylor

在上面的列表中,我想要具有两个标题(kim taylor)的名称并粘贴标题,因为prof它是prof.dr.我的最终列表的子集,应该如下所示

miss | shannon sperling
mr | john smith
prof.dr | kim taylor  

我尝试使用以下代码

void gluetitles(List title)
       {
           for (int i=0;i<title.size();i++) { 
                String names = (String) title.get(i);
                String[] titlename=names.split("\\|");\\split the list with delimiter and extracts titles and names
                String tle=titlename[0];
                String name=titlename[1];

           }     
       }

但我不知道如何比较和获得有两个标题的名字。

4

5 回答 5

1

这是创建以名称为键、标题为值的地图的代码。创建地图后,您应该构建需要将地图的值与键连接起来的列表

 void gluetitles(List title)
    {
        Map<String, String> titleNamesMap = new TreeMap<String, String>();
        for (int i=0;i<title.size();i++) { 
             String names = (String) title.get(i);
             String[] titlename=names.split("\\|");//split the list with delimiter and extracts titles and names
             String tle=titlename[0];
             String name=titlename[1];
             if(titleNamesMap.containsKey(name)){
                 String oldTitle = titleNamesMap.get(name);
                 if(!oldTitle.contains(tle)){
                     String newTle = (tle+".").concat(oldTitle);
                     titleNamesMap.put(name,newTle);
                 }
             }else{
                 titleNamesMap.put(name, tle);
             }
        }
    }

希望它对你有用。

于 2013-11-07T09:17:38.693 回答
1

此代码工作正常...

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Notepad {

    public static void main(String args[]) {
        final List<String> titles = new ArrayList<>();
        titles.add("miss | shannon sperling");
        titles.add("mr | john smith");
        titles.add("prof | kim taylor");
        titles.add("prof.dr | kim taylor");
        gluetitles(titles);
    }

    static void gluetitles(final List<String> titles) {
        final Map<String, String> titleMap = new HashMap<>();
        for (final String names : titles) {
            final String[] titleName = names.split("\\|");
            final String title = titleName[0];
            final String name = titleName[1];
            if (doesMapContainName(titleMap, title, name)) {
                titleMap.put(name, title);
            }
        }
        for (final Entry<String, String> s : titleMap.entrySet()) {
            System.out.println("Name is " + s.getKey() + " Title is "
                    + s.getValue());
        }
    }

    private static boolean doesMapContainName(
            final Map<String, String> titleMap, final String title,
            final String name) {
        return (titleMap.get(name) != null && titleMap.get(name).length() < title
                .length()) || !titleMap.containsKey(name);
    }
}

contains 方法有点脏,但长和短是它是否存在于 map 中,检查这个新值是否比我们已经知道的长,如果是,则添加它,如果它不存在在地图中,添加它。这假设数据总是像示例中那样连接标题,我们有一个 withprof.dr和一个 with prof

于 2013-11-07T09:18:26.207 回答
0

这样做

你的比较器

class SimpleComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.split("\\|")[1].trim().compareTo(o2.split("\\|")[1].trim());
    }
}

您的数据

List<String> list = new ArrayList<String>();
list.add("miss | shannon sperling");
list.add("mr | john smith");
list.add("prof | kim taylor");
list.add("prof.dr | kim taylor");

过滤数据

Set<String> s = new TreeSet<String>(new SimpleComparator());
s.addAll(list);
System.out.println(s);

输出

mr | john smith
prof | kim taylor
miss | shannon sperling
于 2013-11-07T09:14:00.317 回答
0

基本上我会做的是使用某种地图。看起来像这样:

void gluetitles(List<String> title) {
    Map<String, String> map = new HashMap<String,String>();
    for (int i=0;i<title.size();i++) { 
        String names = (String) title.get(i);
        String[] titlename = names.split("\\|");
        String tle = titlename[0];
        String name = titlename[1];

        if(map.containsKey(name)) {
            String savedTitle = map.get(name);
            if(isBetterTitle(tle, savedTitle)) { // compare your savedTitle to the given one here
                map.put(name, tle);
            }
        } else {
            map.put(name, tle);
        }
    }

    for(Iterator<String> it = map.keySet().iterator(); it.hasNext(); ) {
        String name = it.next();
        System.out.println(map.get(name) + name);
    }
}

boolean isBetterTitle(String tle1, String tle2) {
    return tle1.replaceAll(" ", "").contains(tle2.replaceAll(" ", ""));
}
于 2013-11-07T09:15:49.513 回答
0

您可以在 for 循环中使用另一个 for 循环,您必须将当前字符串的标题与列表中其他字符串的标题进行比较。您只需要确保不要通过跳过相同的索引来将字符串与自身进行比较continue。像这样:

void gluetitles(List title)
   {
       for (int i=0;i<title.size();i++) { 
            String names = (String) title.get(i);
            String[] titlename=names.split("\\|");
            String tle=titlename[0];
            String name=titlename[1];

            for (int j = 0; j < title.size(); j++) {
                if (j == i) continue; // This makes sure you don't compare it to itself.

                ...split the string here...

                if (secondTitle.contains(tle)) --> process what you want.
            }
       }     
   }

我不确定该.contains方法,但只需查找查找子集的 String 方法。

于 2013-11-07T09:10:26.837 回答