Java 替换和转换字符串

Java 替换和转换字符串,java,Java,有一个类似于解密的代码,其中引入一个字符串,然后以双倍数字解密,字母可以是从a到j,分别是a=0,b=1。。。j=9。 这个计划很有效,我想知道的是,也许有一个最简单的方法来实现这一点?我是java新手,目前还不知道所有的特性。 代码: import java.util.Scanner; 导入java.util.regex.Matcher; 导入java.util.regex.Pattern; 导入java.lang.Double; 公共类解密 { 私有静态字符串可转换[][]={ {“a

有一个类似于解密的代码,其中引入一个字符串,然后以双倍数字解密,字母可以是从a到j,分别是a=0,b=1。。。j=9。 这个计划很有效,我想知道的是,也许有一个最简单的方法来实现这一点?我是java新手,目前还不知道所有的特性。 代码:

import java.util.Scanner;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入java.lang.Double;
公共类解密
{   
私有静态字符串可转换[][]={
{“a”,“0”},
{“b”,“1”},
{“c”,“2”},
{“d”,“3”},
{“e”,“4”},
{“f”,“5”},
{“g”,“6”},
{“h”,“7”},
{“i”,“8”},
{“j”,“9”},
};
专用静态扫描仪;
公共静态双重解密(字符串encryptedNumber)
{
字符串c=“”;
int i=0;
字符串[]s=encryptedNumber.split(“”);
对于(int j=0;j<2;j++){
如果(c.length()=s.length)
打破
对于(int k=0;k<9;k++){
如果(c.length()=s.length)
打破
if(可转换[k][j].相等信号情况(s[i])){
c+=k;
i++;
}else if(s[i].equalsIgnoreCase(“.”){
c+=”;
i++;
}
}
j--;
}
double d=double.parseDouble(c);
返回d;
}
公共静态void main(字符串arg[])
{   
扫描仪=新扫描仪(System.in);
System.out.println(“输入要解密的字符串:”);
字符串输入=scanner.next();
System.out.println(“解密后的数字是:“+decrypt(input));
}
}

从密码学的角度来看,您所描述的是一个密码。我甚至不会再考虑这种加密,更像是编码(参见)。 您可以将字符串添加到字符串中。当你做这样的事情时

c += k;
Java在那里实际做的是创建一个新的String对象,并将c中的指针更改为该新对象。多年来,JVM在创建和丢弃短期对象时变得更好了,但这仍然是非常低效的。试着用一个新的

您还通过conversionTable执行了一个操作,这意味着您的整个算法是一个O(n^2)操作(请参阅)(对于挑剔的人来说,它实际上是O(m*n),但这对我来说已经足够接近了)。对于这么小的桌子来说完全不相关,但是如果可能的话,避免做那样的事情。另外,当语言中的某些东西想要为您完成时,您自己编写它没有什么意义(这将是一个反复出现的主题)。您的项目是有序的,因此我们可以利用中的一个binarySearch()实现。我会设计一点用法,但只是为了举例说明

您可以利用增强的for循环来迭代大多数列表。我会说,如果你不能使用增强for循环,那么你应该认真考虑while循环。 避免在开关以外的任何地方使用break语句。大多数人会认为他们在同一条船上。

并为变量提供更具描述性的名称。你未来的自己会感谢你的

因此,通过我概述的更改,我们最终使用以下decrypt()方法:


从密码学的角度来看,你所描述的是一个。我甚至不会再考虑这种加密,更像是编码(参见)。 您可以将字符串添加到字符串中。当你做这样的事情时

c += k;
Java在那里实际做的是创建一个新的String对象,并将c中的指针更改为该新对象。多年来,JVM在创建和丢弃短期对象时变得更好了,但这仍然是非常低效的。试着用一个新的

您还通过conversionTable执行了一个操作,这意味着您的整个算法是一个O(n^2)操作(请参阅)(对于挑剔的人来说,它实际上是O(m*n),但这对我来说已经足够接近了)。对于这么小的桌子来说完全不相关,但是如果可能的话,避免做那样的事情。另外,当语言中的某些东西想要为您完成时,您自己编写它没有什么意义(这将是一个反复出现的主题)。您的项目是有序的,因此我们可以利用中的一个binarySearch()实现。我会设计一点用法,但只是为了举例说明

您可以利用增强的for循环来迭代大多数列表。我会说,如果你不能使用增强for循环,那么你应该认真考虑while循环。 避免在开关以外的任何地方使用break语句。大多数人会认为他们在同一条船上。

并为变量提供更具描述性的名称。你未来的自己会感谢你的

因此,通过我概述的更改,我们最终使用以下decrypt()方法:


嗯,char只是一种数据类型;和字符值。。。可以用数字表示,如下所示:。。。所以,假设您只允许ascii字符。。。你不需要地图,你可以做简单的计算。留给读者作为练习。好吧,char只是一种数据类型;和字符值。。。可以用数字表示,如下所示:。。。所以,假设您只允许ascii字符。。。你不需要地图,你可以做简单的计算。留给读者作为练习。
public static double decrypt(String encryptedNumber) {
   StringBuilder builder = new StringBuilder();
   int i = 0;
   String[] encNumElements = encryptedNumber.toLowerCase().split("");
   for (String element : encNumElements) {
      int foundAt = Arrays.binarySearch(conversionTable, new String[]{element, ""}, new Comparator<String[]>() {
            @Override
            public int compare(String[] arg0, String[] arg1) {
               return arg0[0].compareTo(arg1[0]);
            }               
      });
      if (foundAt >= 0) {
         builder.append(conversionTable[foundAt][1]);
      } else {
         // assuming a decimal point here since it's not on the list
         builder.append('.');
      }
   }

   double d = Double.parseDouble(builder.toString());
   return d;
}
   private static final Map<String, String> conversionMap = Stream.of(
         new SimpleEntry<>("a", "0"),
         new SimpleEntry<>("b", "1"),
         new SimpleEntry<>("c", "2"),
         new SimpleEntry<>("d", "3" ),
         new SimpleEntry<>("e", "4"),
         new SimpleEntry<>("f", "5"),
         new SimpleEntry<>("g", "6"),
         new SimpleEntry<>("h", "7" ),
         new SimpleEntry<>("i", "8"),
         new SimpleEntry<>("j", "9"),
         new SimpleEntry<>(".", "."))
         .collect(Collectors.toMap((se) -> se.getKey(), (se) -> se.getValue()));

   public static double decrypt(String encryptedNumber) {
      StringBuilder builder = new StringBuilder();
      String[] encNumElements = encryptedNumber.toLowerCase().split("");
      for (String element : encNumElements) {         
            builder.append(conversionMap.get(element));
      }

      double d = Double.parseDouble(builder.toString());
      return d;
   }
   public static double decrypt(String encryptedNumber) {
      StringBuilder builder = new StringBuilder();
      for (char ch : encryptedNumber.toLowerCase().toCharArray()) {
         if (ch == '.') {
            builder.append('.');
         } else {
            builder.append(ch - 'a');
         }
      }
      return Double.parseDouble(builder.toString());
   }