gpt4 book ai didi

java - 将有序集转换为 Java 中的范围语句

转载 作者:行者123 更新时间:2023-12-02 05:56:09 26 4
gpt4 key购买 nike

我有一个排序集,其元素为 [1,2,3,4,5,10,12,45,46,47,50]

我需要将此集合转换为 Range 语句,其中连续元素用 min .. max 表示。准确地说,这里是预期的输出。

1..5/10/12/45..47/50

由于 1 到 5 是连续的,因此用 1..5 表示,因此用 45..47 表示

10,12等..是不连续的,因此它们被Union分开。

任何人都可以帮助我任何内置方法或有效的算法来实现这一目标吗?目前我正在使用超过 set 的迭代器,但卡在中间。

String SetToRange(Set<Integer> S, long maxint)
{
Integer min,max;
StringBuilder Range=new StringBuilder("");
Iterator I=S.iterator();
switch(S.size())
{
case 0: Range.append("0.."+maxint);
System.out.println("RangeStatement for Set Size 0 is"+Range);
return Range.toString();
case 1: min=max=(Integer)I.next();
Range.append(min);
System.out.println("RangeStatement="+Range);
return Range.toString();
case 2: min=(Integer)I.next();
max=(Integer)I.next();
if(max==min+1)
{
Range.append(min.toString()+".."+max.toString());
}
else
{
Range.append(min+"\\/"+max);
}
System.out.println("Range Statement:-"+Range);
return Range.toString();
}
System.out.println("The Set has more than Two Elements="+S.size());
min=(Integer)I.next();
max=(Integer)I.next();
//Working out logic for this Part using Two Iterators
return Range.toString();

}

谢谢

最佳答案

您可以在 O(n) 时间内完成此操作。此示例展示了面向对象的方法。

首先创建一个Range类。

class Range {
int from;
int to;

public Range setFrom(int from) {
this.from = from;
return this;
}

public Range setTo(int to) {
this.to = to;
return this;
}

@Override
public String toString() {
return "Range [from=" + from + ", to=" + to + "]";
}
}

现在只需迭代数组并比较相邻元素。

如果它们的差值大于 1,则它们不连续,因此您设置前一个范围的上限,将其添加到列表中,然后创建一个新的范围并设置其下限。

public class Test { 

public static void main(String[] args){
Set<Integer> setOfIntegers = new LinkedHashSet<>(Arrays.asList(1,2,3,4,5,10,12,45,46,47,49));
System.out.println(getRanges(setOfIntegers));
}

public static List<Range> getRanges(Set<Integer> s){
List<Range> list = new ArrayList<>();
Integer[] setOfIntegers = s.toArray(new Integer[s.size()]);

Range r = new Range().setFrom(setOfIntegers[0]);
for(int i = 1; i < setOfIntegers.length; i++){
if(setOfIntegers[i] - setOfIntegers[i-1] != 1){
list.add(r.setTo(setOfIntegers[i-1]));
r = new Range().setFrom(setOfIntegers[i]);
}
}
list.add(r.setTo(setOfIntegers[setOfIntegers.length-1]));

return list;
}
}

一些输出:

[1,2,3,4,5,10,12,45,46,47,49] => [Range [from=1, to=5], Range [from=10, to=10], Range [from=12, to=12], Range [from=45, to=47], Range [from=49, to=49]]

[4,7,8,9,15,20,21] => [Range [from=4, to=4], Range [from=7, to=9], Range [from=15, to=15], Range [from=20, to=21]]

[-17,-6,-4,-3,-2,0,1,4] => [Range [from=-17, to=-17], Range [from=-6, to=-6], Range [from=-4, to=-2], Range [from=0, to=1], Range [from=4, to=4]]

请注意,我没有检查集合是否没有元素等。但是您有了总体思路,根据您的需要修改它应该不难。

关于java - 将有序集转换为 Java 中的范围语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com