我有这些带有分隔符的坐标 :
I/System.out: {X=282,Y=990}:
I/System.out: {X=290,Y=990}:
I/System.out: {X=298,Y=990}:
I/System.out: {X=310,Y=990}:
I/System.out: {X=314,Y=990}:
并想用它们填充一个 Point[]
数组,然后我尝试:
private String[] tokens = coordinates.split(Pattern.quote(":"));
private Point[] moviments = new Point[8192];
for (int i = 0; i < tokens.length; i++)
moviments[i] = new Point(tokens[i]);
但出现“类型不兼容”的错误。怎么解决?
版本:
上面的坐标是从这段代码通过Socket
发送的:
C#(发件人)
using System.Net.Sockets;
private List<Point> lstPoints;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
lstPoints = new List<Point>();
lstPoints.Add(new Point(e.X, e.Y));
}
}
private void PictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
lstPoints.Add(new Point(e.X, e.Y));
}
}
private void PictureBox1_MouseUp(object sender, MouseEventArgs e)
{
lstPoints.Add(new Point(e.X, e.Y));
StringBuilder sb = new StringBuilder();
foreach (Point obj in lstPoints)
{
sb.Append(Convert.ToString(obj) + ":" + Environment.NewLine);
}
serverSocket.Send("MDRAWEVENT" + sb.ToString() + Environment.NewLine);
}
android(接收器)
import java.net.Socket;
String xline;
while (clientSocket.isConnected()) {
BufferedReader xreader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), StandardCharsets.UTF_8));
if (xreader.ready()) {
while ((xline = xreader.readLine()) != null) {
xline = xline.trim();
if (xline != null && !xline.trim().isEmpty()) {
if (xline.contains("MDRAWEVENT")) {
String coordinates = xline.replace("MDRAWEVENT", "");
String[] tokens = coordinates.split(Pattern.quote(":"));
/*
Point[] moviments = new Point[8192];
for (int i = 0; i < tokens.length; i++)
moviments[i] = new Point(tokens[i]);
*/
mouseDraw(moviments);
}
}
}
}
public void mouseDraw(Point[] segments) {
Path path = new Path();
path.moveTo(segments[0].x, segments[0].y);
for (int i = 1; i < segments.length; i++) {
path.lineTo(segments[i].x, segments[i].y);
// After draw line, set the next start point
path.moveTo(segments[i].x, segments[i].y);
}
}
最佳答案
我假设这些 I/System.out: 不是接收到的字符串的一部分,否则您需要修改下面的代码以跳过/忽略它们(使用 String.replace
例如)。
调用之后:
private String[] tokens = coordinates.split(Pattern.quote(":"));
您使用乱码 : 分隔文本,因此您将在 token 数组中获得的 token 的形式为:
{X=282,Y=990}
另一方面the Android Point class有三个构造函数
- 无参数构造函数:
Point()
- 两个参数构造函数(一个点的坐标 x 和 y):
Point(int x, int y)
- 一个 arg 构造函数(另一个点作为源):
Point(Point source)
这些构造函数都不匹配您的数据模型,因此您需要:
- 拆分每个token,分别得到每个坐标
- 将它们转换成整数
- 然后调用两个参数的构造函数
另一种选择 是使用无参数构造函数,然后调用 set(int x, int y)
方法来设置坐标。我更喜欢第一种方法。
所以按以下方式更改循环:
for (int i = 0; i < tokens.length; i++) {
String[] coordinates = tokens[i].replace("{", "").replace("}", "").split(",");
int x = Integer.parseInt(coordinates[0].split("=")[1]);
int y = Integer.parseInt(coordinates[1].split("=")[1]);
moviments[i] = new Point(x, y);
}
这应该有效。
关于java - 如何从 String[] 数组填充 Point[] 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59538419/