【问题标题】:Syncronized sorting between two ArrayLists两个 ArrayList 之间的同步字符串
【发布时间】:2013-03-02 06:50:29
【问题描述】:

我有两个 ArrayList。

  • 第一个包含一组大写的单词和 标点符号。

  • 另一个包含同一组词,但带有 删除了大写和标点符号。

.

ArrayList1 ..... ArrayList2

MURDER! ........ murder

It's ........... its

Hello .......... hello

Yes-Man ........ yesman

ON ............. on

第二个数组将所有单词按字母顺序排列,每个单词中的所有字母按字母顺序排列。它看起来像这样:

aemnsy
demrru
ehllo
ist
no

我想这样当我将 ArrayList 2 中的单词按字母顺序排列时,ArrayList 1 中的所有单词都遵循套件:

ArrayList1 ..... ArrayList2

Yes-Man ........ aemnsy

MURDER! ........ demrru

Hello .......... ehllo

It's ........... ist

ON ............. no

我试图用一两个 for 语句创建一个循环,但它最终不起作用并且变得很长。我该怎么做呢?如何有效地做到这一点?

【问题讨论】:

  • 听起来你想使用Map而不是两个Lists
  • 如果可以,请使用TreeMap<String, String>,其中键是来自 ArrayList2 的字符串,值来自 ArrayList1。
  • 两次 Collections.sort 调用有什么问题?
  • @Thihara 你确定你的评论吗?你读过这个问题吗?
  • 糟糕,乍一看我以为他只需要对两个数组列表进行排序...第二次阅读我明白为什么地图是答案...

标签: java collections arraylist sorting


【解决方案1】:

第一种方式 - 我使用映射,其键来自 arrayList2,值来自 arrayList1。将数据映射到地图取决于您。对arrayList2排序后,我从map中得到它的值。

  List<String> arrList1 = new ArrayList<String>();

            arrList1.add("MURDER!");
            arrList1.add("It's");
            arrList1.add("Hello");
            arrList1.add("Yes-Man");
            arrList1.add("ON");

            List<String> arrList2 = new ArrayList<String>();
            arrList2.add("demrru");
            arrList2.add("aemnsy");
            arrList2.add("ist");
            arrList2.add("ehllo");
            arrList2.add("no"); 

            Map<String, String> map1 = new HashMap<String, String>();
            map1.put("aemnsy", "Yes-Man");
            map1.put("demrru", "MURDER!");
            map1.put("ehllo", "Hello");
            map1.put("ist", "It's");
            map1.put("no", "ON");

            Collections.sort(arrList2);

            for (String s : arrList2){
                System.out.println(s + "..........." + map1.get(s));
            }

第二种方式 - 另一种方式是您只能使用已排序的 TreeMap 而不是两个 ArrayList。

Map<String, String> map2 = new TreeMap<String, String>();
            map2.put("ehllo", "Hello");
            map2.put("aemnsy", "Yes-Man");
            map2.put("demrru", "MURDER!");
            map2.put("no", "ON");
            map2.put("ist", "It's");

            for (Map.Entry<String, String> entry : map2.entrySet())
            {
                System.out.println(entry.getKey() + "/" + entry.getValue());
            }

第三种方式——只用了2个ArrayList,但是我们必须自己写排序方法。您是否注意到您的 2 个 ArrayList 元素,例如来自 arrayList2 的 aemnsy 和来自 arrayList1 的 Yes-Man 具有相同的索引?我使用了这一点。

  selectionSort1(arrList2, arrList1);

    for(int i = 0; i < arrList1.size(); i++){
        System.out.println(arrList2.get(i) + "---" + arrList1.get(i));
    }

   public static void selectionSort1(List<String> x, List<String> y) {
    for (int i=0; i<x.size()-1; i++) {
        for (int j=i+1; j<x.size(); j++) {
            if (x.get(i).compareTo(x.get(j)) > 0) {
                //... Exchange elements in first array
                String temp = x.get(i);
                x.set(i, x.get(j));
                x.set(j, temp);

                //... Exchange elements in second array
                temp = y.get(i);
                y.set(i, y.get(j));
                y.set(j, temp);
            }
        }
    }
}

【讨论】:

  • 我更喜欢只使用地图,但遗憾的是这不是练习的目标。然而,使用两个数组列表的映射......好吧,让我玩一下这个,我会回复你的。
  • 如果您要使用TreeMap,最好将其声明为TreeMap&lt;String,String&gt; map2NavigableMap&lt;String, String&gt;,以便使用类/接口中的所有方法(查看我的评论)。
  • 在尝试使用地图时,我发现地图并没有保留 List1 的原始值,而是仅将它们替换为彼此的字谜的单词的值之一.其他的话我不知道去哪儿了。
  • @RyanTibbetts 看起来你以前从未使用过Map。顺便说一句,您真的需要两个 同步 List&lt;String&gt;ArrayList&lt;String&gt; 备份吗?这看起来像是一个设计缺陷,因为您可以拥有一个 AnagramWord 类,其中包含 private String anagramprivate String word 属性,以及一个简单的 List&lt;AnagramWord&gt;,您可以通过提供 Comparator&lt;AnagramWord&gt; 进行排序。
  • 你的第三种方式让我流血了。有了它,您只是在使用String[] 而不是List&lt;String&gt; ls = new ArrayList&lt;String&gt; 重新发明轮子,甚至更糟糕的是:使用选择排序而不是使用优化的Collections.sort(somethingThatImplementList)Collections.sort(somethingThatImplementList)
【解决方案2】:

快速回答。

public class MapAlph {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<String, String>();
        String txt = "Murde!r!";
        ArrayList<Character> alph = new ArrayList<Character>();
        for (int i = 0; i < txt.length(); i++)
            if (Character.isLetter(txt.charAt(i)))
                alph.add(txt.charAt(i));

        Collections.sort(alph);
        Collections.reverse(alph);
        String val = "";
        for (Character c : alph)
            val += c;

        map.put(txt, val);
        System.out.print(txt + " ........ " + map.get(txt));
    }
}

【讨论】:

  • 你刚才是坐在那儿还是什么?
【解决方案3】:

如果您愿意,可以使用TreeMap

Map<String, String> sortedMap = new TreeMap<String, String>();
sortedMap.put("demrru", "MURDER!");
sortedMap.put("ist", "It's");
sortedMap.put("aemnsy", "Yes-Man");
sortedMap.put("ehllo", "Hello");
sortedMap.put("no", "ON");

【讨论】:

    【解决方案4】:

    你可以试试这个:

    import java.util.HashMap;
    import java.util.Map;
    import java.util.TreeMap;
    
    
    public class SortService {
    
        public static void main(String[] args) {
            Map<String, String> originalMap = new HashMap<String, String>();
            originalMap.put("aemnsy", "Yes-Man");
            originalMap.put("demrru", "MURDER!");
            originalMap.put("ehllo", "Hello");
            originalMap.put("ist", "It's");
            originalMap.put("no", "ON");
    
            Map<String, String> sortedMap = new TreeMap<String, String>(originalMap);
            System.out.println(sortedMap);
        }
    
    }
    

    输出:

    {aemnsy=Yes-Man, demrru=MURDER!, ehllo=Hello, ist=It's, no=ON}
    

    【讨论】:

      【解决方案5】:

      这是一个基于单个“键”列表对多个列表进行排序的函数。列表不需要是相同的类型,这里的键列表是类型String,用于对StringIntegerDouble列表(Ideone Example)进行排序:

      List<String> key = Arrays.asList("demrru", "ist", "ehllo", "aemnsy", "no");
      List<String> list1 = Arrays.asList("MURDER!","It's", "Hello","Yes-Man", "ON");
      List<Integer> list2 = Arrays.asList(2, 4, 3, 1, 5);            // Also use Integer type 
      List<Double>  list3 = Arrays.asList(0.2, 0.4, 0.3, 0.1, 0.5);  // or Double type
      
      // Sort all lists (excluding the key)
      keySort(key, list1, list2, list3);
      
      // Sort all lists (including the key)
      keySort(key, key, list1, list2, list3);
      

      输出:

      // Sorted by key:
      [Yes-Man, MURDER!, Hello, It's, ON]
      [aemnsy, demrru, ehllo, ist, no]
      [1, 2, 3, 4, 5]
      [0.1, 0.2, 0.3, 0.4, 0.5]
      

      排序功能

      可以在here 找到一个 Ideone 示例,其中包括参数验证和测试用例。

      public static <T extends Comparable<T>> void keySort(
                                              final List<T> key, List<?>... lists){
          // Create a List of indices
          List<Integer> indices = new ArrayList<Integer>();
          for(int i = 0; i < key.size(); i++)
              indices.add(i);
      
          // Sort the indices list based on the key
          Collections.sort(indices, new Comparator<Integer>(){
              @Override public int compare(Integer i, Integer j) {
                  return key.get(i).compareTo(key.get(j));
              }
          });
      
          // Create a mapping that allows sorting of the List by N swaps.
          Map<Integer,Integer> swapMap = new HashMap<Integer, Integer>(indices.size());
      
          // Only swaps can be used b/c we cannot create a new List of type <?>
          for(int i = 0; i < indices.size(); i++){
              int k = indices.get(i);
              while(swapMap.containsKey(k))
                  k = swapMap.get(k);
      
              swapMap.put(i, k);
          }
      
          // for each list, swap elements to sort according to key list
          for(Map.Entry<Integer, Integer> e : swapMap.entrySet())
              for(List<?> list : lists)
                  Collections.swap(list, e.getKey(), e.getValue());
      }
      

      【讨论】:

      • 我试过第一个列表没有排序,第二个没有和第一个同步!!
      猜你喜欢
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2011-06-22
      • 2018-09-06
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多