我正在编写一个Java程序来获取用户输入的坐标,例如:
((1 2),(3 4))
并将其放入坐标列表中。因此,例如,如果我输入((3 2))
我会去掉所有括号并将字符串拆分为逗号,以便将两个坐标放入 ArrayList 中,如下所示:
[1 2, 3 4]
如果我有一个坐标(即 ((1 2))
(,但是我将如何拆分字符串并将每个唯一坐标作为自己的条目放入 ArrayList?
这是我到目前为止的代码:
public static String getParenthesesContent(String str){
String answer = str.substring(str.indexOf("((")+2,str.indexOf(")"));
return answer;
}
public static void main(String[] args) {
List<String> points = new ArrayList<>();
Scanner in = new Scanner(System.in);
System.out.println("Enter coordinates: ");
String blocks = in.nextLine();
System.out.println(blocks);
String answer = getParenthesesContent(blocks);
System.out.println(answer);
points.add(answer);
}
您应该考虑使用一种更简单、更好的方法来定义输入,以便更好/更快/更轻松地处理该输入(看起来您正在用这种输入格式射击自己的脚(
对问题...您可以使用类似 \((.+?)\)
的模式定义 REGEX。并清理每场比赛,然后将其放入列表中。
public static void main(final String[] args) {
List<String> points = new ArrayList<>();
System.out.println("Enter coordinates: ");
String blocks = "((1 2),(3 4))";
foo(blocks, points);
blocks = "( 1 2)"; //intentionally added space to the input
foo(blocks, points);
blocks = "((1 2),(3 4),(8 7))";
foo(blocks, points);
System.out.println(points);
}
private static void foo(final String blocks, final List<String> points) {
Matcher match = Pattern.compile("\((.+?)\)").matcher(blocks);
while (match.find()) {
String x = match.group(1).replace("(", "").trim();
System.out.println(x);
points.add(x);
}
}
使用 split 方法 split(( 来划分输入,然后去掉括号并添加到列表中。
List<String> points = new ArrayList<>();
Scanner in = new Scanner(System.in);
System.out.println("Enter coordinates: ");
String blocks = in.nextLine();
System.out.println(blocks);
String[] vars= blocks.split(",");
for (int i = 0; i < vars.length; i++) {
String answer = getParenthesesContent(vars[i]);
if(!points.contains(answer)) points.add(answer);//prevent repeat
}
System.out.println(Arrays.toString(points.toArray()));
输出
[1 2, 3 4]
如果您经常使用这些坐标,您还可以创建一个 Position 类来保存 (x,y( 并将位置对象保存在 ArrayList 中。
public class Position {
private int x;
private int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
}
如果您想扩展 Comparable 以轻松对它们进行排序,或者想要以下方法,可能会很方便:
this.getX();
或
this.getPosition();
您还可以将位置添加到哈希映射并存储不同对象的位置。
HashMap<Position, Object> hMap = new HashMap<>();
hMap.put(new Position(1,3), player);