如何以Java风格进行PHP爆炸(“,”),list(),foreach()

时间:2011-03-20 12:35:26

标签: java php

我有PHP代码,我正在将它翻译成Java,但是我们如何使用Java进行像explode(),list(),foreach()这样的PHP?以下PHP代码是我的示例问题:

1. PHP:
  /** 
   * @return: Array
   */
    public function parse($digest) 
    {
      $array = array();
      $parts = explode(", ", $digest);

      foreach ($parts as $x) 
      {
       $bits = explode("=", $x);
       $data[$bits[0]] = str_replace('"','', $bits[1]);
      }

      return $array;
    }

Java (updated):
  private String[] parse(String digest)
  {
    Map<String,String> array = new HashMap<String, String>();
    String[] parts = digest.split(", ");

    for (String x:parts)
    {
      String[] bits = x.split("=");
      array.put(bits[0], bits[1].replace( '"','' )); // later will apply regex
    }

    return array; // incompatible types
  }



2. PHP:
  /** 
   * @return: String
   */
  public function response($text, $user, $pass, $httpmethod, $uri) 
  {        
      list($dummy_digest, $value) = split(' ', $text, 2);    
      $x = $this->parse($value);

      $realm = $x['realm'];
      if ($x['qop'] == 'auth') 
      {
        ...
      }

      $base  = "{$realm}, {$x['realm']}";
      //"Digest username="1", realm="1", nonce="xxxxxx", uri="abc", response="abc", qop="auth", algorithm="MD5", cnonce="", nc="1"";
      return $base;

  }


Java problem:
   public String response(String text, String user, String pass, String httpmethod, String uri)
   {  
      // how to do such list() like php?
      return "Digest username="1", realm="1", nonce="xxxxxx", uri="abc", response="abc", qop="auth", algorithm="MD5", cnonce="", nc="1"";
   } 

3 个答案:

答案 0 :(得分:3)

爆炸   - StringUtils.splitPreserveAllTokens(String str,char separatorChar)

foreach只是用不同的方式写的   - for(String s:array)

我认为Java中没有任何等效的列表,我认为不可能写一个,因为Java中的所有变量都是“按值传递”。

答案 1 :(得分:3)

与java完全相同,您可以使用以下方法解析数据:

Map<String, String> key_map = new HashMap<String, String>();
String[] parts_of_string = "var=test, var2=test2".split(", ");
for(String part : parts_of_string) {
    String[] key_and_value_parts = part.split("=");
    key_map.put(key_and_value_parts[0], key_and_value_parts[1]);
    System.out.println(key_and_value_parts[0] + " <-> " + key_and_value_parts[1]);
}

更新(第二种方法):

Java不像PHP那样处理数组。 php可以通过使用类似$ array [“my_var”]的字符串来引用数组中的对象,但Java只能通过它们在数组中的索引来引用。因此,您需要使用地图,这允许您将某个键映射到值。您可以像这样解析文本:

private static Map<String, String> parse(String digest) {
    String[] parts = digest.split(", ");
    Map<String, String> map = new HashMap<String, String>();
    for (String x : parts) {
        String[] bits = x.split("=");

        //Remove "'s here if you want to keep them in the string

        map.put(bits[0], bits[1]);
    }
    return map;
}

然后,您可以使用方法get on来访问此地图提供的任何信息。然后,您将指定所需的密钥,地图将返回与该密钥关联的值。请务必使用.containsKey来检查Ma是否包含您要查找的密钥。

因此,当您使用上一个函数解析信息时,您可以使用此函数访问这些值,例如:

Map<String, String> parsed_map = parse("A realm=\"1234\", B=\"3434df323423423\", C=\"300.00\", D=\"loopback\"'");
String info = parsed_map.get("B");
System.out.println(info);

希望有所帮助,否则请求:D

PS:我实际上没有对此进行测试,请务必检查它是否按预期运行。

答案 2 :(得分:1)

Java中的示例foreach()(就像示例)clone()方法(使用深度克隆 - 原型设计模式)

public class Order {

private List<Item> items = new ArrayList<Item>();

public Order clone() {
    Order newOrder = new Order();
    for (Item originalItem : this.items) {
        Item newItem = new Item();
        newItem.setPrice(originalItem.getPrice());
        newOrder.items.add(newItem);
    }
    return newOrder;
}

现在应该真的很清楚,如何使用foreach, 希望它有所帮助