首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用比较器对字符串包含4个数字的字符串列表进行排序

使用比较器对字符串包含4个数字的字符串列表进行排序
EN

Stack Overflow用户
提问于 2020-08-05 18:16:16
回答 1查看 35关注 0票数 0

我正在尝试解决数据结构和算法的4和问题,这个问题在Geek for Geek上有:https://practice.geeksforgeeks.org/problems/find-all-four-sum-numbers/0

这是我的解决方案:

代码语言:javascript
复制
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
 {
     public static void solve(int[] a,int n,int k)
     {
         Arrays.sort(a);
         HashMap<Integer,List<int[]>> hs = new HashMap<>();
         HashSet<String> set = new HashSet<>();
         List<String> ss = new ArrayList<>();
         boolean flag=false;
         for(int i=0;i<n-1;i++)
         {
             for(int j=i+1;j<n;j++)
             {
                 int sum = a[i]+a[j];
                 if(hs.containsKey(k-sum))
                 {
                     List<int[]> indexes = hs.get(k-sum);
                      
                    for(int[] index : indexes)
                    {
                        int i1 = index[0];
                        int i2 = index[1];
                        if(i2<i && i1!=i && i1!=j && i2!=i && i2!=j)
                        {
                            
                            String s = new String(""+a[index[0]]+" "+a[index[1]]+" "+a[i]+" "+a[j]+" $");
                            flag=true;
                            if(!set.contains(s))
                                ss.add(s);
                            set.add(s);    
                        }
                    }
                 }
                 List<int[]> temp = hs.getOrDefault(sum,new ArrayList<>());
                 temp.add(new int[]{i,j});
                 hs.put(sum,temp);
             }
         }
         if(!flag)
         System.out.print(-1);
         else
         {
             Collections.sort(ss,(String a1,String b1)->{
                 String[] st1 = a1.split(" ");
                 String[] st2 = b1.split(" ");
                //  if(a1.compareTo(b1)==0)
                //     return 0;
                 for(int i=0;i<st1.length;i++)
                 {
                     if(st1[i].compareTo(st2[i])>0)
                     {
                         return 1;
                     }
                 }
                 return -1;
             });
             for(String s1 : ss)
                System.out.print(s1);
         }
         System.out.println();
     }
     
     
    public static void main (String[] args)
     {
     Scanner sc = new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0)
        {
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] a = new int[n];
            for(int i=0;i<n;i++)
                a[i]=sc.nextInt();
            solve(a,n,k);
        }
     }
}

答案需要对字符串进行排序,即所有唯一的数字都应该按递增顺序排序,我已经生成了一个字符串列表,但我无法按递增顺序对它们进行排序。

对于Ex:

输入: 27 179 88 84 3 51 54 99 32 60 76 68 39 12 26 86 94 39 70 34 78 67 1 97 2 17 92 52

其正确输出为:1 2 84 92 $1 3 76 99 $1 3 78 97 $1 12 67 99 $1 12 78 88 $1 17 67 94 $1 26 60 92 $1 26 68 84 $1 32 51 95 $1 32 52 94 $1 32 54 92 $1 32 60 86 $1 32 68 78 $1 32 70 76 $1 34 52 92 $1 34 60 84 $1 34 68 76 $1 39 51 88 $1 51 60 67 $2 3 86 88 $2 12 68 97 $2 12 70 95 $2 17 68 92 $2 17 76 84 $2 26 52 99 $2 26 54 97 $2 26 67 84 $2 32 51 94 $2 32 6778 $2 34 51 92 $2 34 67 76 $2 39 39 99 $2 39 52 86 $2 39 54 84 $2 39 60 78 $2 39 68 70 $3 12 67 97 $3 12 70 94 $3 12 76 88 $3 12 78 86 $3 17 60 99 $3 17 67 92 $3 26 51 99 $3 32 52 92 $3 32 60 84 $3 32 68 76 $3 34 54 88 $3 39 51 86 $3 39 67 70 $3 52 54 70 $ .........

我的代码输出:您的输出是: 12 34 39 94 $17 26 39 97 $34 39 39 67 $17 39 39 84 $2 39 39 99 $26 34 51 68 $26 32 51 70 $12 32 51 84 $3 39 51 86 $1 39 51 88 $2 34 51 92 $2 32 51 94 $1 32 51 95 $12 17 51 99 $3 26 51 99 $34 39 52 54 $26 34 52 67 $ ......

如何使用比较器,我写了一些比较器的登录,但它要么给出错误的输出,要么给出某种错误:

代码语言:javascript
复制
Runtime Error:
Runtime ErrorException in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.base/java.util.TimSort.mergeLo(TimSort.java:781)
    at java.base/java.util.TimSort.mergeAt(TimSort.java:518)
    at java.base/java.util.TimSort.mergeCollapse(TimSort.java:448)
    at java.base/java.util.TimSort.sort(TimSort.java:245)
    at java.base/java.util.Arrays.sort(Arrays.java:1515)
    at java.base/java.util.ArrayList.sort(ArrayList.java:1749)
    at java.base/java.util.Collections.sort(Collections.java:179)
    at GFG.solve(File.java:46)
    at GFG.main(File.java:78)

请帮帮我

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-08-05 19:48:05

在实现Comparator<T> (使用Collections.sort()中的lambda表达式)时,必须遵循一些规则。一条规则是,如果第一个元素必须在第二个元素之前,则计算器必须返回-1;如果第一个元素必须在第二个元素之后,则返回1;如果第二个元素可以以任何顺序出现,则返回0。因为您不返回0,所以违反了这条规则。

您的实现违反的第二个规则是,compare()方法必须是可传递的,这意味着如果是compare(A, B) == 0compare(B, C) == 0,则是compare(A, C) == 0。可能排序算法依赖于该规则为真,这可能是您看到的IllegalArgumentException的原因。有关如何正确实现Comparator的更多详细信息,请查看JavaDoc

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63263025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档