我有一个对象列表,我想根据条件处理对象的子集,然后创建一个包含已处理对象的新列表。
对象列表
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];
}
}
但我不知道如何比较并获得有两个标题的名称。
答案 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(" ", ""));
}