0

私が見ているコードは、チャートをプロットするためのオフポイントで構成された文字列を返す URL 呼び出しです。[14.1(ポイント),1363649400(UTC のタイムスタンプは後で変換されます)]

String = [14.1,1363649400],[14.4,1363650300],[14.6,1363651200],[15.1,1363652100],[14.3,1363653000],[14.2,1363653900],[14.8,1363654800]................

最良の方法は、角括弧を削除してから String.split() を使用することです。

この文字列をマップに変換する方法について、誰かがより良いアイデアを持っているかどうか疑問に思っています。

4

4 に答える 4

1

これにより、マップの解析と構築が処理されます。マップもタイムスタンプでソートされます。

final Matcher m = Pattern.compile("\\[(.*?),(.*?)\\]").matcher(input);
final Map<Long, Double> points = new TreeMap<>();
while (m.find()) 
  points.put(Long.parseLong(m.group(2), Double.parseDouble(m.group(1)));
于 2013-03-19T14:12:11.337 に答える
1

そのようです:

points[] = string.substring(1, string.length()-1).split("],[");

の配列になります

"1,3", "3,4"
于 2013-03-19T14:06:11.793 に答える
1

データ オブジェクトを保持するクラスを作成します。

private static final class Data {

    private final BigDecimal point;
    private final Date date;

    public Data(final String point, final String date) {
        this.point = new BigDecimal(point);
        this.date = new Date(Long.parseLong(date));
    }

    @Override
    public String toString() {
        return "Data{" + "point=" + point + ", date=" + date + '}';
    }
}

次に、正規表現パターンを使用して文字列を解析し、Dataオブジェクトを作成します。Stringおそらく非常に長く、一致しようとしてエクスプレスエンジンがそれに沿って繰り返しバックトラックすることを望まないため、私は所有格マッチャーを使用しました。

Data、ここのように、個々Stringの を実際のデータ型に解析することさえできます。

public static void main(String[] args) {
    final String s = "[14.1,1363649400],[14.4,1363650300],[14.6,1363651200],[15.1,1363652100],[14.3,1363653000],[14.2,1363653900],[14.8,1363654800]";
    final Pattern p = Pattern.compile("\\[([^,]++),(\\d++)\\]");
    final Matcher matcher = p.matcher(s);
    final Collection<Data> datas = new LinkedList<Data>();
    while (matcher.find()) {
        datas.add(new Data(matcher.group(1), matcher.group(2)));
    }
    for (final Data data : datas) {
        System.out.println(data);
    }
}

出力:

Data{point=14.1, date=Fri Jan 16 19:47:29 GMT 1970}
Data{point=14.4, date=Fri Jan 16 19:47:30 GMT 1970}
Data{point=14.6, date=Fri Jan 16 19:47:31 GMT 1970}
Data{point=15.1, date=Fri Jan 16 19:47:32 GMT 1970}
Data{point=14.3, date=Fri Jan 16 19:47:33 GMT 1970}
Data{point=14.2, date=Fri Jan 16 19:47:33 GMT 1970}
Data{point=14.8, date=Fri Jan 16 19:47:34 GMT 1970}

明らかに、それらDataMapまたはSetまたはあなたに合ったものに入れることができます。

于 2013-03-19T14:13:37.010 に答える
0

正規表現を使用することは、少なくとも私にとっては最善の方法ではないようです。Java での正規表現のパフォーマンスは、正直なところ、非常に悪いものです。O(n)文字列の長さである nだけを使用するパーサーを自分で作成します。

どのように私はそれを行うだろう:

public void splitSequence(String str) {
                List<Double> lstPoint = new ArrayList<>();
    List<Long> lstTime = new ArrayList<>();
    char[] buf = new char[128];
    int i=0;
    boolean isPoint = true;
    for(Character c : str.toCharArray()) {
        if(c == ',') {
            if(isPoint) {
                lstPoint.add(new Double(new String(buf,0,i)));
                isPoint = false;
            }
            else {
                lstTime.add(Long.parseLong(new String(buf,0,i)));
                isPoint = true;
            }
            buf = new char[128];
            i=0;
        } else if(!(c == '[' || c == ']')) {
            buf [i++] = c;
        }
    }
    }
//usage
splitSequence("[14.1,1363649400],[14.4,1363650300],[14.6,1363651200],[15.1,1363652100],[14.3,1363653000],[14.2,1363653900],[14.8,1363654800]");
于 2013-03-19T14:22:16.417 に答える