Files
corejava/corejava第10版/v2ch10/spinner/PermutationSpinnerModel.java
T
2019-05-22 19:31:49 +08:00

100 lines
2.4 KiB
Java

package spinner;
import javax.swing.*;
/**
* A model that dynamically generates word permutations.
*/
public class PermutationSpinnerModel extends AbstractSpinnerModel
{
private String word;
/**
* Constructs the model.
* @param w the word to permute
*/
public PermutationSpinnerModel(String w)
{
word = w;
}
public Object getValue()
{
return word;
}
public void setValue(Object value)
{
if (!(value instanceof String)) throw new IllegalArgumentException();
word = (String) value;
fireStateChanged();
}
public Object getNextValue()
{
int[] codePoints = toCodePointArray(word);
for (int i = codePoints.length - 1; i > 0; i--)
{
if (codePoints[i - 1] < codePoints[i])
{
int j = codePoints.length - 1;
while (codePoints[i - 1] > codePoints[j])
j--;
swap(codePoints, i - 1, j);
reverse(codePoints, i, codePoints.length - 1);
return new String(codePoints, 0, codePoints.length);
}
}
reverse(codePoints, 0, codePoints.length - 1);
return new String(codePoints, 0, codePoints.length);
}
public Object getPreviousValue()
{
int[] codePoints = toCodePointArray(word);
for (int i = codePoints.length - 1; i > 0; i--)
{
if (codePoints[i - 1] > codePoints[i])
{
int j = codePoints.length - 1;
while (codePoints[i - 1] < codePoints[j])
j--;
swap(codePoints, i - 1, j);
reverse(codePoints, i, codePoints.length - 1);
return new String(codePoints, 0, codePoints.length);
}
}
reverse(codePoints, 0, codePoints.length - 1);
return new String(codePoints, 0, codePoints.length);
}
private static int[] toCodePointArray(String str)
{
int[] codePoints = new int[str.codePointCount(0, str.length())];
for (int i = 0, j = 0; i < str.length(); i++, j++)
{
int cp = str.codePointAt(i);
if (Character.isSupplementaryCodePoint(cp)) i++;
codePoints[j] = cp;
}
return codePoints;
}
private static void swap(int[] a, int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void reverse(int[] a, int i, int j)
{
while (i < j)
{
swap(a, i, j);
i++;
j--;
}
}
}