我尝试根据后缀从列表创建子列表。
public class Test {
public static void main(String args[]) {
List<List<String>> subList = new ArrayList<List<String>>();
List<String> myList = new ArrayList<String>();
myList.add("Text_1");
myList.add("XYZ_3");
myList.add("ABC_1");
myList.add("Text_2");
myList.add("Text_3");
myList.add("XYZ_1");
myList.add("XYZ_2");
myList.add("ABC_2");
for (String item : myList) {
List<String> tempList = new ArrayList<String>();
String suffix = item.substring(item.lastIndexOf("_"));
tempList.add(item);
for (String value : myList) {
if (value.endsWith(suffix) && !tempList.contains(value)) {
tempList.add(value);
}
}
System.out.println(tempList);
}
}
}
我期待如下
// Text_1, ABC_1, XYZ_1
// Text_2, ABC_2, XYZ_2
// Text_3, XYZ_3
但实际是
[Text_1, ABC_1, XYZ_1]
[XYZ_3, Text_3]
[ABC_1, Text_1, XYZ_1]
[Text_2, XYZ_2, ABC_2]
[Text_3, XYZ_3]
[XYZ_1, Text_1, ABC_1]
[XYZ_2, Text_2, ABC_2]
[ABC_2, Text_2, XYZ_2]
感谢任何帮助。感谢
答案 0 :(得分:4)
尝试使用TreeMap?
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class QuickTester {
public static void main(String[] args) {
List<String> myList = new ArrayList<String>();
myList.add("Text_1");
myList.add("XYZ_3");
myList.add("ABC_1");
myList.add("Text_2");
myList.add("Text_3");
myList.add("XYZ_1");
myList.add("XYZ_2");
myList.add("ABC_2");
TreeMap <String, ArrayList<String>> map = new TreeMap<>();
for (String item : myList) {
// contents[0] is value, contents[1] is suffix
String [] contents = item.split("_");
if(!map.containsKey(contents[1])) {
ArrayList<String> values = new ArrayList<>();
values.add(contents[0]);
map.put(contents[1], values);
}
else {
map.get(contents[1]).add(contents[0]);
}
}
for(String key : map.keySet()) {
System.out.println("Key: " + key);
System.out.print("Values: ");
for(String value : map.get(key)) {
System.out.print(value + " ");
}
System.out.println();
}
}
}
<强>输出:强>
Key: 1
Values: Text ABC XYZ
Key: 2
Values: Text XYZ ABC
Key: 3
Values: XYZ Text
答案 1 :(得分:2)
您可以使用列表添加看到的后缀。如果此列表包含后缀,则不执行任何操作。
List<String> seenSuffixes = new ArrayList<String>();
for (String item : myList) {
String suffix = item.substring(item.lastIndexOf("_"));
if(!seenSuffixes.contains(suffix)){
seenSuffixes.add(suffix);
List<String> tempList = new ArrayList<String>();
tempList.add(item);
for (String value : myList) {
if (value.endsWith(suffix) && !tempList.contains(value)) {
tempList.add(value);
}
}
System.out.println(tempList);
}
}
答案 2 :(得分:1)
您的代码存在一些问题:
1)您在每个项目上构建tempList,因此在结果正确的情况下,您将在myList中的每个项目中看到它们。你需要“记住”你处理的每个后缀,这样你就不会再处理它了。 HashMap
将完成工作
2)如果您希望tempList具有uniqe值,请使用Set
这是完整的解决方案
public static void main(String args[]) {
Map<String, Set<String>> subList = new HashMap<>();
List<String> myList = new ArrayList<String>();
myList.add("Text_1");
myList.add("XYZ_3");
myList.add("ABC_1");
myList.add("Text_2");
myList.add("Text_3");
myList.add("XYZ_1");
myList.add("XYZ_2");
myList.add("ABC_2");
for (String item : myList) {
String suffix = item.substring(item.lastIndexOf("_"));
if (subList.containsKey(suffix)) continue;
Set<String> tempSet = new HashSet<String>();
tempSet.add(item);
for (String value : myList) {
if (value.endsWith(suffix)) {
tempSet.add(value);
}
}
subList.put(suffix, tempSet);
}
System.out.println(subList);
}
输出:
{_1=[Text_1, ABC_1, XYZ_1], _2=[ABC_2, XYZ_2, Text_2], _3=[XYZ_3, Text_3]}
答案 3 :(得分:1)
问题为@sharonbn,但是每次获得后缀时都可以更新值。
List<List<String>> subList = new ArrayList<List<String>>();
List<String> myList = new ArrayList<String>();
myList.add("Text_1");
myList.add("XYZ_3");
myList.add("ABC_1");
myList.add("Text_2");
myList.add("Text_3");
myList.add("XYZ_1");
myList.add("XYZ_2");
myList.add("ABC_2");
for (int i = 0; i < myList.size(); i++) {
String item = myList.get(i);
List<String> tempList = new ArrayList<String>();
int location = item.lastIndexOf("_");
if (location < 0) continue;
String suffix = item.substring(location);
tempList.add(item);
for (int j = i + 1; j < myList.size(); j++) {
String value = myList.get(j);
if (value.endsWith(suffix) && !tempList.contains(value)) {
tempList.add(value);
myList.set(j, "-------");
}
}
System.out.println(tempList);
}
答案 4 :(得分:0)
看看这个,我使用带有后缀值的地图作为关键字,将常用类型列表作为值。
List<String> myList = new ArrayList<String>();
myList.add("Text_1");
myList.add("XYZ_3");
myList.add("ABC_1");
myList.add("Text_2");
myList.add("Text_3");
myList.add("XYZ_1");
myList.add("XYZ_2");
myList.add("ABC_2");
Map<String, List<String>> map=new HashMap<String,List<String>>();
for(String str:myList){
String[] arryStr=str.split("_");
if(! map.containsKey(arryStr[1])){
List<String> tmpList=new ArrayList<String>();
tmpList.add(str);
map.put(arryStr[1],tmpList);
}else{
List<String> existingList=map.get(arryStr[1]);
existingList.add(str);
}
}