处理Java中的对象列表

时间:2013-11-07 08:59:07

标签: java

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

对象列表

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

在上面的列表中,我想要有两个标题(kim taylor)的名称并粘贴标题,因为profprof.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];

           }     
       }

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

5 个答案:

答案 0 :(得分: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);
             }
        }
    }

希望它对你有用。

答案 1 :(得分: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);
    }
}

包含方法有点脏,但它的长短是否存在于地图中,检查这个新值是否比我们已经知道的更长,如果是,则添加它,如果它没有在地图中存在,添加它。这假设数据始终只是连接标题,如示例中所示,我们有一个prof.dr和一个prof

答案 2 :(得分:0)

您可以在for循环中使用另一个for循环,将当前String的标题与列表中其他字符串的标题进行比较。您只需通过使用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方法。

答案 3 :(得分: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

答案 4 :(得分: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(" ", ""));
}
相关问题