Java - создание подсписка из списка на основе суффикса
Я пытаюсь создать списки из списка на основе суффикса.
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]
Любая помощь приветствуется. Спасибо
5 ответов
Есть несколько проблем с вашим кодом:
1) вы строите tempList для каждого элемента, поэтому, пока результат будет правильным, вы увидите их для каждого элемента в myList. вам нужно "помнить" каждый суффикс, который вы обрабатываете, чтобы вы больше не обрабатывали его. HashMap
сделаю работу
2) если вы хотите, чтобы tempList имел уникальные значения, используйте 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]}
Попробуйте использовать 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
Вы можете использовать список для добавления видимых суффиксов. Если этот список содержит суффикс, вы ничего не делаете.
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);
}
}
Проблемы как @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);
}
Посмотрите на это, я использую карту со значениями суффиксов в качестве ключа и список общих типов в качестве значения.
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);
}
}