java中的类内类
编辑, 我不能分享这张照片,但让我们再试一次 我有一个数组,它有4个部分,第一部分只取以a开头的字符串,最后一部分取以d开头的字符串 输入字符串仅包含a、b、c、d,使其更简单 当输入为“bcda”时,它将进入数组。接下来它应该选择数组[2],因为第二个字符是c,然后是d数组[3],然后是字符a的数组[4] 然后我会插入这个字符串。所以下一次,如果我想看到给定的字符串,比如说相同的“bcda”是否存在,我将使用char序列遍历路径,而不是比较可用集合中的所有字符串,然后我将知道这个字符串名是否存在 假设我输入了几个基于a,b,c,d的字符串 例如,“acdb”、“bcda”、“dbca”等 我想要的是,当我的程序收到字符串“acdb”时,它会这样保存java中的类内类,java,arrays,class,traversal,Java,Arrays,Class,Traversal,编辑, 我不能分享这张照片,但让我们再试一次 我有一个数组,它有4个部分,第一部分只取以a开头的字符串,最后一部分取以d开头的字符串 输入字符串仅包含a、b、c、d,使其更简单 当输入为“bcda”时,它将进入数组。接下来它应该选择数组[2],因为第二个字符是c,然后是d数组[3],然后是字符a的数组[4] 然后我会插入这个字符串。所以下一次,如果我想看到给定的字符串,比如说相同的“bcda”是否存在,我将使用char序列遍历路径,而不是比较可用集合中的所有字符串,然后我将知道这个字符串名是否存
----------------
| a| b | c | d |
----------------
|
|
----------------
| a| b | c | d |
----------------
|
|
----------------
| a| b | c | d |
----------------
|
|
----------------
| a| b | c | d |
----------------
|
|
and here it can add string in list
很不幸,由于我的几点原因,我无法添加图像:(我希望我用自己创造的形象正确地解释
所以当我搜索这些限制范围内的任何字符串时,我可以很容易地找到这个字符串是否存在
我很困惑如何在类内创建类内类…:(
我可以创建一个简单的列表,并在数组中添加给定的字符串。这很简单,但无法前进
class MyList {
TreeSet<String> list = new TreeSet<String>();
}
class Test
{
MyList Array[] = new MyList [4];
public Test(){
for (int k = 0; k < 4; k++){
Array[k] = new MyList ();
}
}
}
类MyList{
树集列表=新树集();
}
课堂测试
{
MyList数组[]=新的MyList[4];
公开考试(){
对于(int k=0;k<4;k++){
数组[k]=new MyList();
}
}
}
如果您想在一个类中创建一个类,下面是您将如何实现这一点的。当内部类与外部类密切相关,但实际上没有在其他任何地方使用时,您可以使用它。或者您可能只是出于任何原因想将它们组合在一起
class OuterClass {
class InnerClass {
}
}
如果您希望一个类包含它自己,下面是您将如何实现的方法。您可以这样做来创建一个对象列表。这看起来更像您正在尝试的操作
class MyClass {
MyClass nextInTheList;
public MyClass() {
}
public void setNext(MyClass next) {
nextInTheList = next;
}
}
内部类几乎与您的问题无关。以下是您真正想要做的:
public class CharNode extends AbstractCollection<CharSequence>{
Map<Character, CharNode> children = new HashMap<>();
int mark = 0;
@Override
public void add(CharSequence s){
if(s.length()==0){mark++; return}
if(!children.containsKey(s.charAt(0))
children.put(s.charAt(0), new CharNode());
children.get(s.charAt(0)).add(s.subSequence(1,s.length()));
}
@Override
public void remove(CharSequence s){
if(s.length()==0){mark--; return;}
CharNode child = children.get(s.charAt(0));
child.remove(s.subSequence(1,s.length()));
if(child.isEmpty()) children.remove(s.charAt(0));
}
@Override
public boolean contains(CharSequence s){
if(s.length()==0) return mark;
return children.containsKey(s.charAt(0)) &&
children.get(s.charAt(0)).contains(s.subSequence(1,s.length()));
}
@Override
public int size(){
int result = mark;
for(CharNode child: children.values()) result+= child.size();
return result;
}
@Override
public Iterator<CharSequence> iterator(){
return new Iterator<CharSequence>(){
@Override public boolean hasNext(){ /* you do this part */ }
@Override public CharSequence next(){ /* you do this part */ }
@Override public boolean remove(){ /* you do this part */ }
}
}
}
public类CharNode扩展了AbstractCollection{
Map children=newhashmap();
整数分=0;
@凌驾
公共无效添加(字符序列){
如果(s.length()==0){mark++;return}
如果(!children.containsKey(s.charAt(0))
put(s.charAt(0),new CharNode());
get(s.charAt(0)).add(s.subSequence(1,s.length());
}
@凌驾
公共无效删除(字符序列){
如果(s.length()==0){mark--;return;}
CharNode child=children.get(s.charAt(0));
移除(s.子序列(1,s.长度());
if(child.isEmpty())children.remove(s.charAt(0));
}
@凌驾
公共布尔包含(字符序列){
如果(s.length()==0)返回标记;
返回子项。containsKey(s.charAt(0))&&
get(s.charAt(0)).contains(s.subSequence(1,s.length());
}
@凌驾
公共整数大小(){
int结果=分数;
for(CharNode-child:children.values())结果+=child.size();
返回结果;
}
@凌驾
公共迭代器迭代器(){
返回新的迭代器(){
@重写公共布尔hasNext(){/*您执行此部分*/}
@重写public CharSequence next(){/*执行此部分操作*/}
@重写公共布尔删除(){/*您执行此部分*/}
}
}
}
最后一种方法,
iterator
,涉及到使用匿名内部类,这是唯一一种真正重要的内部类,也是我推荐给不熟悉内部类工作方式的人使用的唯一类型。您想格式化输出吗?为什么不使用TreeSet?如何使用Collections.sort(str.tocharray())
您不想使用内部类。使用内部类有很多很多“gotcha”。如果可能的话,我会尽量避免使用它们。您在问什么?如果一个字符串包含的字母与添加的另一个字符串的字母完全相同?