2016-12-05 386 views
0

我想编译和测试我在线看到的代码Expanding an IP add。但是,当我尝试编译它时,我收到有关StringBuilder替换方法的错误。它说:Java - StringBuilder替换()显示错误:方法String.replace(char,char)不适用

IPadd.java:52: error: no suitable method found for replace(int,int,String) 
        address.replace(tempCompressLocation,tempCompressLocation+2,":"); 
         ^
method String.replace(char,char) is not applicable 
    (actual and formal argument lists differ in length) 

我检查了代码的替换方法,它显示了正确的数据类型是(int,int,String)。我想知道我可以如何运行这个程序。

import java.util.*; 

public class IPadd { 

    public static void main (String[] args){ 

     Scanner sc = new Scanner(System.in); 

     System.out.print("Input address: "); 
     String address = sc.nextLine(); 

     // Store the location where you need add zeroes that were removed during uncompression 

     int tempCompressLocation=address.indexOf("::"); 

     //if address was compressed and zeroes were removed, remove that marker i.e "::" 
     if(tempCompressLocation!=-1){ 
      address.replace(tempCompressLocation,tempCompressLocation+2,":"); 
     } 

     //extract rest of the components by splitting them using ":" 
     String[] addressComponents=address.toString().split(":"); 

     for(int i=0;i<addressComponents.length;i++){ 
      StringBuilder uncompressedComponent=new StringBuilder(""); 
      for(int j=0;j<4-addressComponents[i].length();j++){ 

       //add a padding of the ignored zeroes during compression if required 
       uncompressedComponent.append("0"); 

      } 
      uncompressedComponent.append(addressComponents[i]); 

      //replace the compressed component with the uncompressed one 
      addressComponents[i]=uncompressedComponent.toString(); 
     } 


     //Iterate over the uncompressed address components to add the ignored "0000" components depending on position of "::" 
     ArrayList<String> uncompressedAddressComponents=new ArrayList<String>(); 

     for(int i=0;i<addressComponents.length;i++){ 
      if(i==tempCompressLocation/4){ 
       for(int j=0;j<8-addressComponents.length;j++){ 
        uncompressedAddressComponents.add("0000"); 
       } 
      } 
      uncompressedAddressComponents.add(addressComponents[i]); 

     } 

     //iterate over the uncomopressed components to append and produce a full address 
     StringBuilder uncompressedAddress=new StringBuilder(""); 
     Iterator it=uncompressedAddressComponents.iterator(); 
     while (it.hasNext()) { 
      uncompressedAddress.append(it.next().toString()); 
      uncompressedAddress.append(":"); 
     } 
     uncompressedAddress.replace(uncompressedAddress.length()-1, uncompressedAddress.length(), ""); 
     return uncompressedAddress.toString(); 
     } 

} 
+0

你检查了什么代码的'replace()'方法?在String中没有这样的方法。' – EJP

回答

1

试试这个:

StringBuilder address = new StringBuilder(sc.nextLine()); 
+0

我试过了,但它给了我另一个错误:错误:不兼容的类型:意外的返回值 return uncompressedAddress.toString(); – Andrew

+0

因为你正在返回一些主要方法。用这个System.out.println(uncompressedAddress.toString())写它来控制它。而不是返回uncompressedAddress.toString(); –

1

我认为你试图在开始字符和结束字符之间进行替换。在这种情况下,您应该获得这些字符的索引并将其用于替换方法中。否则,你必须将这些字符转换为int以使它们适用于方法。但我想这不是你所感兴趣的东西。

int index = stringbuilder.indexOf(String.valueOf(tempCompressLocation)); 
stringbuilder.replace(index, index + 2, ":"); 

您可以简单地使用Stringbuilder#setCharAt在特定的位置设置字符。但不确定它是否会满足您的要求。

正如Jobin的答案中所述,您对String使用了不正确的方法。您可以使用String的替换方法而不是StringBuilder。

例如,

address = address.replace("::", ":");//Replace all :: with : 
address = address.replaceFirst("::", ":");//Replace first occurrence of :: with : 
+1

对不起,我不太确定..我想删除if语句if(tempCompressLocation!= - 1)address.replace(tempCompressLocation,tempCompressLocation + 2,“:” );并用你的代码替换它? – Andrew

1

你试图使用从StringBuilder类上String替代方法..

address.replace(tempCompressLocation, tempCompressLocation + 2, ":"); 

地址是String不是StringBuilder

1

String.replace方法需要两个CharSequence s或两个char s。我认为你可以通过使用替换字符串本身:

if (tempCompressLocation != -1) { 
    address.replace("::", ":"); 
} 

看看是否适用于你的例子。祝你好运!

+0

它显示另一个错误:IPadd.java:94:错误:不兼容的类型:意外的返回值 return uncompressedAddress.toString(); – Andrew

+0

是啊!我忘了那个:你不能从'void'方法返回。或者删除最后一行:'return uncompressedAddress.toString()',或者更改'System.out.print'的'return' ...以防你想查看'uncompressedAddress'的值。 –