Java-如何在字符串中添加字符

Java-如何在字符串中添加字符,java,Java,我对Java和一般的编码都是新手,我正在为我所在的一个类做一个关于加密的项目。我制作了一个代码,首先将字母转换为数字,例如a=1,b=2,等等。下一部分通过为编码消息中的下一个字符指定要加或减的数字来混淆数字。(见附图) 字母编号和混杂编号示例 Character Letter Number Jumble Number _______________|_______________________|_______________ A

我对Java和一般的编码都是新手,我正在为我所在的一个类做一个关于加密的项目。我制作了一个代码,首先将字母转换为数字,例如
a=1
b=2
,等等。下一部分通过为编码消息中的下一个字符指定要加或减的数字来混淆数字。(见附图)

字母编号和混杂编号示例

Character       Letter Number           Jumble Number
_______________|_______________________|_______________
A               1                       +3
B               2                       -1
C               3                       +2
D               4                       +5
E               5                       -3
比如说,需要发送的信息是“abcde”。所以“a”的数字是1,但它也有一个“+3”,这将被添加到下一个字符的数字上,所以不是2,而是5,依此类推。最后的信息将是“1,5,2,6,10”

到目前为止,我已经能够将字母转换成数字,但不知道如何继续对已经从字母转换成的数字进行加减运算。这是我到目前为止所拥有的

  import java.util.HashMap;
  import java.util.Map;


  public class CodeApp
  {
  public static void main(String[] args) 
  {
final Map<Character, Integer> map;
final String str = "hello world";
// Message to be encoded goes here  

map = new HashMap<>();  

map.put('a', 1);
map.put('b', 2);
map.put('c', 3);
map.put('d', 4);
map.put('e', 5);
map.put('f', 6);
map.put('g', 7);
map.put('h', 8);
map.put('i', 9);
map.put('j', 10);
map.put('k', 11);
map.put('l', 12);
map.put('m', 13);
map.put('n', 14);
map.put('o', 15);
map.put('p', 16);
map.put('q', 17);
map.put('r', 18);
map.put('s', 19);
map.put('t', 20);
map.put('u', 21);
map.put('v', 22);
map.put('w', 23);
map.put('x', 24);
map.put('y', 25);
map.put('z', 26);
// This code is inefficient like this because I eventually plan to scramble the order of the numbers in relation to the letters, like a=23, b=5, c=15, etc.
for(final char c : str.toCharArray())
{
  final Integer val;

  val = map.get(c);

  if(val == null)
  {   
    // some sort of error
  }
  else
  {
    System.out.print(val + " ");
  }
}

System.out.println();
  }
}
import java.util.HashMap;
导入java.util.Map;
公共类代码应用程序
{
公共静态void main(字符串[]args)
{
最终地图;
最后一个字符串str=“hello world”;
//要编码的消息在这里
map=新的HashMap();
地图放置('a',1);
地图放置('b',2);
地图放置('c',3);
地图放置('d',4);
地图放置('e',5);
地图放置('f',6);
地图放置('g',7);
地图放置('h',8);
地图放置('i',9);
地图放置('j',10);
地图放置('k',11);
地图放置('l',12);
地图放置('m',13);
地图放置('n',14);
地图放置('o',15);
地图放置('p',16);
地图放置('q',17);
地图放置('r',18);
地图.put('s',19);
地图放置('t',20);
地图放置('u',21);
地图放置('v',22);
地图放置('w',23);
地图放置('x',24);
地图放置('y',25);
地图放置('z',26);
//这样的代码效率很低,因为我最终计划对字母的数字顺序进行打乱,比如a=23,b=5,c=15,等等。
for(最终字符c:str.toCharArray())
{
最终整数val;
val=map.get(c);
if(val==null)
{   
//某种错误
}
其他的
{
系统输出打印(val+“”);
}
}
System.out.println();
}
}

非常感谢您的任何帮助

作为一个概念性的解决方案,我建议将每个值添加到代码列表中,然后将它们转换为输出。比如:

List<Integer> codes = new ArrayList<Integer>();

for(final char c : str.toCharArray())
{
  final Integer val;

  val = map.get(c);

  if(val == null)
  {   
    // some sort of error
  }
  else
  {
    // don't try to output here
    //System.out.print(val + " ");

    // add this code to the list
    codes.Add(val);        
  }
}
// transform codes list into string delimited text and output
List code=new ArrayList();
for(最终字符c:str.toCharArray())
{
最终整数val;
val=map.get(c);
if(val==null)
{   
//某种错误
}
其他的
{
//不要试图在这里输出
//系统输出打印(val+“”);
//将此代码添加到列表中
代码。添加(val);
}
}
//将代码列表转换为字符串分隔的文本并输出

如果这里的代码不正确,请在for循环外定义变量。 下面的代码是我的建议,首先您可以像下面这样定义hashmap:

final Map<Character, String> map;
map.put('a', "1");

您可以尝试使用两个HashMap来完成此操作,如下所示:

String str = "abcde";

Map<Character, Integer> charMap = new HashMap<Character, Integer>();// value of character
charMap.put('a', 1);
charMap.put('b', 2);
charMap.put('c', 3);
charMap.put('d', 4);
charMap.put('e', 5);
// put more entry for rest of the characters

Map<Character, Integer>  jumblMap = new HashMap<Character, Integer>();// value to add
jumblMap.put('a', 3);    
jumblMap.put('b', -1);
jumblMap.put('c', 2);
jumblMap.put('d', 5);
jumblMap.put('e', -3);
// put more entry for rest of the characters

char c = str.charAt(0);
int val = charMap.get(c);// No jumble value for first character
System.out.print(val + " ");
char prevC;
for(int i = 1; i < str.length(); i++) {
  c = str.charAt(i);
  prevC = str.charAt(i - 1);// previous character
  val = charMap.get(c) + jumblMap.get(prevC);// evaluate with jumble value of previous char
  System.out.print(val + " ");
}
这里,最初将所有字符值和混杂值存储在两个HashMap

charMap
-保存每个字符值

jumblMap
-保存混杂值


charMap.get(c)+jumblMap.get(PrevC)
-假设上述每个映射中的所有字符都有条目,则计算值。

不是答案:

获取字母表序列的一个棘手方法是

String str = "AbCdEf";
for (char c : str.toLowerCase().toCharArray()) {
   int val = Character.toLowerCase(c) - 'a' + 1;
   System.out.print(val + " ");
} 

输出:
123456

这个
+3
是从哪里来的?如果我理解正确,你提供的图像中的“+3,-1,+2,+5,-3”可以等同于密码系统的名称?另外,如果
e
是纯文本消息的最后一个字符,那么它的相关编号(在本例中
-3
)是无用的,对吗?好的,谢谢,但这会给加减法指定的字母加上或减去数字。所以a=1,然后3加1。我想要的是将3添加到加密代码的下一个字符中,在本例中是b=2。如果将数字添加到指定给它的字符中或从中减去该数字,那么它将始终像代码中那样结束,因此“a”可能等于4,“b”也可能等于1。非常感谢您的帮助,谢谢@柯林斯,请检查我的最新答案。它应该能满足你的要求。非常非常感谢!
1 5 2 6 10
String str = "AbCdEf";
for (char c : str.toLowerCase().toCharArray()) {
   int val = Character.toLowerCase(c) - 'a' + 1;
   System.out.print(val + " ");
}