【问题标题】:How fill a Point[] array from a String[] array?如何从 String[] 数组填充 Point[] 数组?
【发布时间】:2020-04-19 15:32:25
【问题描述】:

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

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);
    }
}

【问题讨论】:

  • 请显示类Point的定义。最有可能的是,不存在将单个 String 作为参数的 c'tor。
  • @Turing85, Point 是安卓原生的。
  • 我假设 Point 是 docs.microsoft.com/en-us/dotnet/api/… Point 需要 2 个整数来创建而不是字符串,您需要将字符串解析为所需的数据类型。

标签: java c# android arrays sockets


【解决方案1】:

我假设这些 I/System.out: 不是接收到的字符串的一部分,否则您需要修改下面的代码以跳过/忽略它们(使用 String.replace例如)。

调用后:

private String[] tokens = coordinates.split(Pattern.quote(":"));

您使用文字 : 分隔文本,因此您将在令牌数组中获得的令牌采用以下形式:

{X=282,Y=990}

另一方面,the Android Point class 有三个构造函数

  • 没有参数构造函数:Point()
  • 两个 args 构造函数(一个点的坐标 x 和 y):Point(int x, int y)
  • 一个 arg 构造函数(另一个点作为源):Point(Point source)

这些构造函数都不匹配您的数据模型,因此您需要:

  • 拆分每个令牌以分别获取每个坐标
  • 将它们转换为整数
  • 然后调用两个args构造函数

另一种选择是使用无参数构造函数,然后调用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);
}

这应该可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多