【问题标题】:Java - Create sublist from a list based on suffixJava - 从基于后缀的列表创建子列表
【发布时间】:2015-09-08 22:47:13
【问题描述】:

我正在尝试从基于后缀的列表创建子列表。

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]

感谢任何帮助。谢谢

【问题讨论】:

  • 每次迭代都会创建一个新的ArrayList 对象。
  • 我想在 tempList 中包含所有分组项。你觉得这有什么问题吗?

标签: java arraylist collections iterator sublist


【解决方案1】:

尝试使用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 

【讨论】:

    【解决方案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);
               }
    
            }
    

    【讨论】:

      【解决方案3】:

      你的代码有几个问题:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          看看这个,我正在使用一个带有后缀值作为键和常见类型列表作为值的映射。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-01
            • 1970-01-01
            • 2014-09-23
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-12
            相关资源
            最近更新 更多