diff --git a/src/net/azib/ipscan/core/values/NumericListValue.java b/src/net/azib/ipscan/core/values/NumericListValue.java index f3c341f7..f3a5cc19 100755 --- a/src/net/azib/ipscan/core/values/NumericListValue.java +++ b/src/net/azib/ipscan/core/values/NumericListValue.java @@ -14,7 +14,7 @@ import java.util.Collection; * * TODO: add parsing functionality here. * - * @author Anton Keks Keks + * @author Anton Keks */ public class NumericListValue { @@ -29,7 +29,7 @@ public class NumericListValue { * @param displayAsRanges whether toString() outputs all number or their ranges */ public NumericListValue(Collection numbers, boolean displayAsRanges) { - // copy numbers to an array (unfortunately toArray() cannot be used because int[] is not IS-A Object[]) + // copy numbers to an array (unfortunately toArray() cannot be used because int[] is not an Object[]) this.numbers = new int[numbers.size()]; int c = 0; for (Number n : numbers) { @@ -45,33 +45,38 @@ public class NumericListValue { public String toString() { StringBuffer sb = new StringBuffer(); - int prevPort = Integer.MAX_VALUE; + int prevNumber = Integer.MAX_VALUE; + int rangeStartNumber = 0; boolean isRange = false; int i = 0; if (numbers.length > 0) { - prevPort = numbers[0]; - sb.append(prevPort); + prevNumber = numbers[0]; + sb.append(prevNumber); } while (++i < numbers.length) { - int port = numbers[i]; + int curNumber = numbers[i]; - if (displayAsRanges && prevPort + 1 == port) { - isRange = true; + if (displayAsRanges && prevNumber + 1 == curNumber) { + if (!isRange) { + isRange = true; + rangeStartNumber = prevNumber; + } } else { if (isRange) { - sb.append('-').append(prevPort); + // display short ranges with comma, long ranges with dash + sb.append(rangeStartNumber+1 == prevNumber ? ',' : '-').append(prevNumber); isRange = false; } - sb.append(',').append(port); + sb.append(',').append(curNumber); } - prevPort = port; + prevNumber = curNumber; } if (isRange) { - sb.append('-').append(prevPort); + sb.append(rangeStartNumber+1 == prevNumber ? ',' : '-').append(prevNumber); } return sb.toString(); diff --git a/test/net/azib/ipscan/core/values/NumericListValueTest.java b/test/net/azib/ipscan/core/values/NumericListValueTest.java index 66a42280..c3e56ee6 100755 --- a/test/net/azib/ipscan/core/values/NumericListValueTest.java +++ b/test/net/azib/ipscan/core/values/NumericListValueTest.java @@ -1,5 +1,7 @@ /** - * + * This file is a part of Angry IP Scanner source code, + * see http://www.azib.net/ for more information. + * Licensed under GPLv2. */ package net.azib.ipscan.core.values; @@ -11,9 +13,8 @@ import java.util.TreeSet; import org.junit.Test; - /** - * @author Anton Keks Keks + * @author Anton Keks */ public class NumericListValueTest { @@ -21,10 +22,12 @@ public class NumericListValueTest { public void testToString() { assertEquals("", new NumericListValue(Collections.emptyList(), true).toString()); assertEquals("1", new NumericListValue(Arrays.asList(1), true).toString()); + assertEquals("1,2", new NumericListValue(Arrays.asList(1, 2), true).toString()); assertEquals("1-3", new NumericListValue(Arrays.asList(1, 2, 3), true).toString()); assertEquals("1-3", new NumericListValue(new TreeSet(Arrays.asList(2, 3, 1)), true).toString()); assertEquals("1,2,3", new NumericListValue(Arrays.asList(1, 2, 3), false).toString()); - assertEquals("1,5-6,15", new NumericListValue(Arrays.asList(1, 5, 6, 15), true).toString()); + assertEquals("1,5,6,15", new NumericListValue(Arrays.asList(1, 5, 6, 15), true).toString()); + assertEquals("1,5-8,15", new NumericListValue(Arrays.asList(1, 5, 6, 7, 8, 15), true).toString()); assertEquals("103,85,89,1", new NumericListValue(Arrays.asList(103, 85, 89, 1), true).toString()); } }