Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-根据后缀从列表创建子列表_Java_Arraylist_Collections_Iterator_Sublist - Fatal编程技术网

Java-根据后缀从列表创建子列表

Java-根据后缀从列表创建子列表,java,arraylist,collections,iterator,sublist,Java,Arraylist,Collections,Iterator,Sublist,我正试图从基于后缀的列表中创建子列表 public class Test { public static void main(String args[]) { List<List<String>> subList = new ArrayList<List<String>>(); List<String> myList = new ArrayList<String>();

我正试图从基于后缀的列表中创建子列表

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]
[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]

感谢您的帮助。谢谢

您的代码有几个问题:

1) 您在每个项目上都构建了模板列表,因此虽然结果是正确的,但您将在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);
  }

问题是@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 subList=new ArrayList();
List myList=new ArrayList();
myList.add(“文本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”);
对于(int i=0;i
是否尝试使用


可以使用列表添加可见后缀。如果此列表包含后缀,则不执行任何操作

    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);
           }

        }
List seenSuffixes=newarraylist();
用于(字符串项:myList){
字符串后缀=item.substring(item.lastIndexOf(“”);
如果(!seenSuffixes.contains(后缀)){
请参见后缀。添加(后缀);
List templast=new ArrayList();
圣堂武士。添加(物品);
for(字符串值:myList){
if(value.endsWith(后缀)&&!templast.contains(value)){
圣殿骑士。增加(价值);
}
}
System.out.println(圣殿骑士);
}
}

看看这个,我使用一个带有后缀值的映射作为键,一个普通类型列表作为值

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);
        }

    }
List myList=new ArrayList();
myList.add(“文本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 Map=newhashmap();
for(字符串str:myList){
字符串[]arryStr=str.split(“”);
if(!map.containsKey(arryStr[1])){
List tmpList=new ArrayList();
tmpList.add(str);
map.put(arryStr[1],tmpList);
}否则{
List existingList=map.get(arryStr[1]);
现有列表。添加(str);
}
}

每次迭代都要创建一个新的
ArrayList
对象。我想将所有分组项都放在tempList中。你认为这有什么问题吗?
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);
           }

        }
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);
        }

    }