java - 如何从 String[] 数组填充 Point[] 数组?

标签 java c# android arrays sockets

我有这些带有分隔符的坐标 :

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/

相关文章:

java - Spring @Transactional 注释被忽略

java - 如何修复 "com.jdbc.SQLServerException: Invalid column name ' taxi_id' "

java - 在公共(public) jar 文件中禁用 log4j

java - 在 GridLayout 中移动组件

c# - 如何在运行时为 LINQ 和 Entity Framework 生成链式方法表达式?

c# - 进程无法访问该文件,因为它正被另一个进程使用

java - Lotus Notes 日历报告

java - Android 到 Playstation 和其他游戏机

android - 像在 SureLock 应用程序中所做的那样删除最近的应用程序按钮

java - 如何使用 BottomNavigationBar 保存 fragment 的状态?